在C中将内存初始化为零是什么意思?

What does it mean to initialize memory to zero in C?

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

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

NOTE:我问的不是malloc和calloc的区别,而是内存初始化为0的意思

提前致谢。

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

p = calloc(12, 1024);

大致相当于:

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

所以 calloc 做了两件 malloc 没有做的事情:

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

为此,calloc 适合分配数组,特别是标量值数组。

有些情况下这种初始化是不可取的:

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

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

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

分配内存时,您是在向操作系统发出请求,要求为您的程序保留一块内存。简单地保留内存并不一定意味着内存中的任何数据都将被初始化。

初始化为零的内存是内存,其中每个可寻址对象(每个字节)的值始终等于零,当您将其作为非填充类型读取时(例如 unsigned char),

它很有用,因为您总是获得相同的内存内容(而不是 "random" 垃圾)。这消除了此内存块可能充当程序非确定性行为的潜在来源的可能性。确定性行为可帮助您更早发现错误。

这只是意味着在保留该内存块后所有位将被设置为零。结果是什么取决于你对数据的解释。例如,如果将它们转换为内存 addresses/pointers,它们将等同于 NULL。如果将它们转换为某种整数类型,它们将等同于零值整数。

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

正如@Blorgbeard 在一条评论中所说。我的意思是您分配的块中的每个字节都将设置为 0x00.