由malloc()`分配的内存有哪些内容?

Jul*_*ian 5 c malloc initialization dynamic-memory-allocation

malloc()用于分配内存空间之后,我很好奇指针究竟是什么?该联机帮助页告诉我calloc()初始化已分配的内存空间为零.

malloc()函数分配大小字节并返回指向已分配内存的指针. 内存未初始化.如果size为0,则malloc()返回NULL或一个以后可以成功传递给free()的唯一指针值.

calloc()函数为每个大小为字节的nmemb元素数组分配内存,并返回指向已分配内存的指针. 内存设置为零.如果nmemb或size为0,则calloc()返回NULL或一个以后可以成功传递给free()的唯一指针值.

我在C中为C(haha)创建了一个非常简短的示例程序:

int main() {
    char *dynamic_chars;
    unsigned amount;
    printf("how much bytes you want to allocate?\n");
    scanf("%d", &amount);

    dynamic_chars = (char*)malloc(amount*sizeof(char));
    printf("allocated:\n%s\n", dynamic_chars);

    free(dynamic_chars);
    return 0;
Run Code Online (Sandbox Code Playgroud)

}

但是,在执行此代码时,它只输出任何内容.如果我初始化内存,例如0xFFFF使用循环初始化每个字节,那么程序会向我显示我期望的内容.内存空间实际存在,因为我不会收到错误声称我正在尝试访问未初始化的变量.

由于内存空间通常不会被删除但被标记为可重写,我想知道如果通过执行我的程序,我是否应该能够看到以前使用的随机内存字节?但我什么都看不到,所以我真的很困惑malloc().

EDIT1

关于malloc()或者可能是内存使用的另一件事,关于我的程序是有趣的:如果我使用calloc(),分配内存,我可以通过例如监视来跟踪我的程序的实际内存使用情况.例如,如果我告诉我的程序,每次分配1.000.000.000字节的内存calloc()我将在我的系统监视器中看到以下内容: 使用<code>malloc()</code>,我什么也看不见.我明白,只是通过分配内存,我当时并没有真正使用它,但我仍然感到困惑的是为什么我的操作系统(unix衍生物)不会将其识别为使用它.因为<code>malloc()</code>就像<code>calloc()</code>将物理地址返回到我没有得到的内存位置一样,这个内存区域似乎实际上并没有被操作系统保留.那么我可以在系统监视器中看到它吗?如果我想将此作为一个新问题发布,请告诉我.但我认为,因为问题仍然是关于<code>malloc()</code>它如何适应这里.</p></p>
    </div>
  </div>

<div class=

Sou*_*osh 12

不,malloc()返回未初始化的内存,其内容是不确定的.因此,尝试使用该值调用未定义的行为.

引用C11,附件§J.2,未定义的行为

malloc使用函数分配的对象的值

在这种情况下,%s需要一个以null结尾的char数组.但是,内容dynamic_chars是不确定的,因此很可能根本没有空终止符,这将导致超出范围的内存访问,而后者又调用UB.

引用C11,章节§7.22.3.5,malloc功能(强调我的):

malloc函数为大小由其指定size其值不确定的对象分配空间.

也就是说,请参阅此讨论,了解为什么不投出malloc()和家人的回报价值C..

  • @RadLexus读取不确定值为`char`可能会产生陷阱表示.但即使在没有陷阱表示的系统上,也没有定义将不确定的值传递给库函数,例如`printf`.[见这里](http://stackoverflow.com/a/25074258/1505939)进一步讨论 (3认同)