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 %in",test[i]);
    memset(test,0,sizeof(int) * 15);
    for(int i = 0 ; i < 15; i ++ )
        printf("test after memset is %in",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 函数为大小为 由大小指定,其值不确定。

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

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

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

相关内容

  • 没有找到相关文章

最新更新