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

ste*_*ave 11 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;
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出非常奇怪:

    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
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我以为我刚刚malloc编写了一些可以使用的新内存?

那怎么样:

int test[15];
Run Code Online (Sandbox Code Playgroud)

我必须打电话 memset(&test,0,sizeof(int) * 15);吗?

1''*_*1'' 20

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

  • @ 1''仅对字节数组有效.你不应该使用malloc来初始化一个`int`s数组,而不是0 (2认同)