malloc归零内存?

时间:2009-10-25 21:48:50

标签: c malloc

鉴于使用gcc 4.3.3编译的C代码

#include <stdio.h>
#include <stdlib.h>


int main(int argc, char * argv[])
{

    int * i;

    i = (int *) malloc(sizeof(int));

    printf("%d\n", *i);
    return 0;

}

我希望输出是malloc()返回的内存中的任何内容,而输出是0. malloc是否将它返回的内存归零?如果是这样,为什么?

6 个答案:

答案 0 :(得分:34)

malloc本身不会将内存清零,但许多操作系统会将程序请求的内存归零(出于安全原因)(以防止一个进程访问另一个进程使用的潜在敏感信息)。

答案 1 :(得分:7)

malloc()函数不会将分配的内存设置为任何特定值。如果要确保内存为零,请使用calloc()或等效内容。否则,你得到之前的任何东西(在你的情况下,可能是零)。

答案 2 :(得分:2)

分配的内存中的值是正式未定义的。 C99声明:The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate. malloc()可以做任何想做的事情,包括将其归零。这可能是故意的,实现的副作用,或者你可能只有很多内存恰好是0。

使用Apple的gcc 4.0.1在OS X上的FWIW即使进行了大量的分配,我也无法让它出现0:

for( idx = 0; idx < 100000; idx++ ) {
    i = (int *) malloc(sizeof(int));
    printf("%d\n", *i);
}

答案 3 :(得分:2)

Malloc不必填充内存。出于性能原因,发布版本通常不会对内存执行任何操作。 “安全”库可能具有清除内存的malloc实现。这取决于图书馆实施者。有些常见的模式由各种编译器的explained in this stackoverflow topic调试库填充到内存中。

答案 4 :(得分:1)

你绝对不能依赖它为0。 malloc一个更大的块并转储它看。

答案 5 :(得分:-1)

是否为int; int = 0;或int = 00000000;它会占用内存中的相同空间。无论字符串中还有什么内容,printf都经常将前0作为空终止符。如果您使用的是字符串比较器,并且0是占位符,那么我建议您使用ANYTHING,但是将0用于该占位符,因为基于字符串的库确实很烂。尝试按F,然后根据需要自己编写控件,以插入null term或换行符,因为这样会更方便移植。