在使用malloc分配新内存后,是否必须调用memset

#include "stdlib.h" #include "stdio.h" #include "string.h" int main(int argc, char* argv[]) { int *test = malloc(15 * sizeof(int)); for(int i = 0;i < 15 ;i ++ ) printf("test is %i\n",test[i]); memset(test,0,sizeof(int) * 15); for(int i = 0 ; i < 15; i ++ ) printf("test after memset is %i\n",test[i]); return 0; } 

我得到的输出非常奇怪:

  test is 1142126264 test is 32526 ... test is 1701409394 test is 1869348978 test is 1694498930 test after memset is 0 test after memset is 0 test after memset is 0 test after memset is 0 test after memset is 0 ... test after memset is 0 test after memset is 0 test after memset is 0 test after memset is 0 test after memset is 0 

为什么会这样? 我以为我只是malloc一些可以使用的新内存?

那怎么样:

 int test[15]; 

我是否必须调用memset(&test,0,sizeof(int) * 15);

malloc不会初始化它分配的内存。 你只需得到那里已有的随机垃圾。 如果您确实需要将所有内容设置为0,请使用calloc ,从而降低性能。 (如果需要初始化为0以外的其他内容,请将memset用于字节数组,否则手动循环数组以初始化它。)

当您从堆请求内存时,堆将只分配可用的任何内存块。 该存储器块可能具有一些数据,这取决于先前的写入。

C11 7.22.3.4

 void *malloc(size_t size); 

malloc函数为一个对象分配空间,该对象的大小由size指定,其值是不确定的。

如果要将值设置为零,请改用calloccalloc基本上只是一个对malloc调用和一个memset调用的封装函数(设置值为0)。

出于性能原因,malloc()不保证新分配的内存的内容。 它可能是零,可能是随机数据,也可能是任何东西。 如果你想要malloc的内存有一个特定的值,那么你可以这样做。