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

时间:2012-11-16 04:41:53

标签: c 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);

4 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:2)

C11 7.22.3.4

void *malloc(size_t size);
  

malloc函数为 size 所在的对象分配空间   由size指定,其值是不确定的。

如果您希望将值设置为零,请改用calloccalloc基本上只是一次调用malloc的一个包装函数,一次调用memset(设置值为0)。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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