鉴于使用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是否将它返回的内存归零?如果是这样,为什么?

有帮助吗?

解决方案

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

其他提示

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

分配的内存中的值是正式未定义的。 C99声明: malloc函数为一个对象分配空间,该对象的大小由size指定,其值是不确定的。 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);
}

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

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

是否为int; INT = 0;或者int = 00000000;它将在内存中占据相同的空间。无论字符串中还有什么,printf通常会将前0作为空终止符捕获。如果你正在使用字符串比较器而0是占位符,我建议你使用ANYTHING但是0作为该占位符,因为基于字符串的库真的很糟糕。尝试F然后根据需要自己插入空术语或换行符来编写控件,这将更加便携。

scroll top