在C中将内存初始化为零意味着什么?

时间:2016-04-25 21:40:05

标签: c memory allocation

我正在阅读C中的指针和动态内存分配。我发现函数calloc()malloc()类似,但前者确实将内存初始化为0。

我不明白为什么将内存初始化为零

注意:我不是在询问malloc和calloc之间的区别,而是将内存初始化为零的意思。

提前致谢。

7 个答案:

答案 0 :(得分:11)

p = calloc(12, 1024);

大致相当于:

p = malloc(12 * 1024);
if (p != NULL)
    memset(p, 0, 12 * 1024);

所以calloc执行malloc没有的两件事:

  • 它将nmembsize变量相乘以计算分配的总大小
  • 它将分配的每个字节设置为零

为此, calloc适用于分配数组,特定的标量值数组。

有些情况下不需要进行初始化:

  • 初始化为全零位对于指针来说是不够的,其中NULL可能不是全零。
  • 如果您要将分配用作缓冲区并将数据读入其中,那么首先将其初始化为全零是浪费时间。

答案 1 :(得分:3)

每个对象都有一个底层表示形式作为内存中的字节序列。当通过calloc获取时,这些字节的值为零。这对特定对象意味着什么取决于它们在内存中的表示方式。例如,uint16_t保证在没有填充的情况下占用16位,并且表示位构成其值,因此*(uint16_t*) calloc(sizeof(uint16_t), 1)是保持值为零的对象。相反,如果您通过malloc获取内存,则必须尝试从中读取内存,而是必须首先为其分配值。< / p>

答案 2 :(得分:3)

malloc()返回的内存块包含该内存中发生的任何数据;它包含以前使用该内存的剩余部分。

在返回之前,calloc()0设置为它返回的内存块的所有字节。

答案 3 :(得分:2)

分配内存时,您向操作系统发出请求,为程序的使用预留一块内存。简单地保留存储器并不一定意味着已经初始化了存储器中的任何数据。

答案 4 :(得分:2)

初始化为零的内存是当您将其作为非填充类型(例如*** LOG [Mon Apr 25 23:42:49 CEST 2016] TEST : Test filter on site.siteId = 'NEW' 2 documents )读取时,每个可寻址对象(每个字节)始终具有等于零的值的内存,

从某种意义上说,它总是获得相同的内存内容(而不是“随机”垃圾)。这消除了此内存块可能充当程序的非确定性行为的潜在来源的可能性。确定性行为可以帮助您更早地发现错误。

答案 5 :(得分:1)

这只意味着在保留该存储块后所有位都将设置为零。结果取决于您对数据的解释。例如,如果将它们转换为内存地址/指针,它们将等效于NULL。如果将它们转换为某种整数类型,它们将等效于零值整数。

是否要使用malloc()并保留垃圾值(所以只保留内存而不修改以前的值)或使用calloc()来获取干净的内存块取决于你计划做什么用这个内存块。通常,在谈论普通软件时,将所有内存值设置为零的成本可以忽略不计,但是如果您正在开发一个性能极高的软件,那么每一点都很重要,您可以自由地使用这些内存将其设置为零。

答案 6 :(得分:1)

@Blorgbeard在一篇评论中说。我只是意味着您要分配的块中的每个字节都将设置为0x00