2016-04-25 106 views
0

我阅读有关C.指针和动态内存分配我发现功能calloc()类似于malloc()但前者不初始化内存为0在C中初始化内存为零意味着什么?

我不明白为什么它意味着初始化内存为零

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

在此先感谢。

+5

这意味着将每个字节设置为0x00。 – Blorgbeard

+3

[malloc和calloc之间的区别?](http://stackoverflow.com/questions/1538420/difference-between-malloc-and-calloc) –

+0

@ I'L'l这不是一个fyi它不是一个重复的问题。 – lmiguelvargasf

回答

7
p = calloc(12, 1024); 

大致等同于:

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

所以calloc做两件事情,malloc不会:

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

为此,calloc是良好的用于分配的阵列,标量值的特定阵列。

有这样的情况:该初始化是不希望的:

  • 初始化为全零比特是不够的指针,其中NULL可以不是全零。
  • 如果您打算将分配作为缓冲区使用,并将数据读入缓冲区,那么首先将其初始化为全零将是浪费时间。
+0

谢谢@JonathonReinhart! – lmiguelvargasf

3

每个对象都有一个底层表示形式,作为内存中的一系列字节。当它们通过calloc获得时,这些字节的值为零。这对特定对象意味着什么取决于它们在内存中的表现方式。例如,uint16_t保证占用16位而没有填充,并且表示位组成它的值,所以*(uint16_t*) calloc(sizeof(uint16_t), 1)是保存零值的对象。相比之下,如果您通过malloc获得内存,您必须而不是试图从中读取,而您必须首先将赋值给

2

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

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

+0

谢谢@axiac,你的最后一句话真的很清楚。 – lmiguelvargasf

+0

“它包含以前使用该内存的剩余部分。”不是由C定义的,但它是可能的。 – chux

2

当您分配内存时,您向操作系统发出一个请求以为程序的使用预留一块内存。只需预留内存并不一定意味着内存中的任何数据都将被初始化。该真实初始化为零

2

存储器是存储器,其中每个可寻址的对象(每个字节),将始终具有等于零的值,当你看它作为一个非填充类型(例如unsigned char

这是有用的意思是你总是得到相同的内存内容(而不是“随机”垃圾)。这消除了这个内存块可能会作为程序的非确定性行为的潜在来源的可能性。确定性行为可以帮助您更早地发现错误。

1

这只是表示保留该内存块后,所有位都将设置为零。结果取决于你对数据的解释。例如,如果将这些内容转换为内存地址/指针,它们将等于NULL。如果您将它们转换为某种整数类型,它们将相当于零值整数。

是否要使用malloc()并保留垃圾值(因此只保留内存而不修改其前一次的值)或使用calloc()获取干净的内存块取决于您打算如何处理这个内存块。正常情况下,将所有内存值设置为零的代价在讨论正常软件时可以忽略不计,但如果您正在开发一款性能极高的软件,那么每一项都很重要,您可以自由使用这些内存,无论是否设置归零。

+0

“例如,如果将这些内容转换为内存地址/指针,则它们将等于NULL。”我不认为C标准可以保证这一点。它将被设置为全零位,但不需要对应于NULL指针。 –

1

正如@Blorgbeard在一个评论中说的那样。我只是意味着你正在分配的块中的每个字节将被设置为0x00