11
#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

4 回答 4

22

malloc不初始化它分配的内存。你只会得到那里已经存在的任何随机垃圾。如果您真的需要将所有内容设置为 0,请使用calloc性能损失。(如果您需要初始化为 0 以外的值,请使用memset字节数组,否则手动循环数组以对其进行初始化。)

于 2012-11-16T04:46:00.883 回答
2

C11 7.22.3.4

void *malloc(size_t size);

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

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

于 2012-11-16T07:38:32.667 回答
1

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

于 2012-11-16T04:44:33.123 回答
0

出于性能原因, malloc() 不保证新分配内存的内容。它可能是零,它可能是随机数据,它可能是任何东西。如果您希望 malloc'ed 内存具有特定值,则由您决定。

于 2012-11-16T04:50:19.453 回答