calloc() 和 NULL

Posted

技术标签:

【中文标题】calloc() 和 NULL【英文标题】:calloc() and NULL 【发布时间】:2015-06-30 07:00:51 【问题描述】:

我知道 calloc 分配内存并向每个单元格写入零,所以我的问题是: 使用 calloc 或使用 malloc 并在向它们写入 NULL 的单元格上运行有区别吗? calloc 的零是否等价于 NULL?

【问题讨论】:

NULL 可能不会以0(所有位均为0) 作为表示形式。 这里实现的一些有趣问题 - locklessinc.com/articles/calloc @BrianAgnew 为什么文章中的 OP 不简单地检查溢出:n > SIZE_MAX/size @2501 - 我不知道。也许他们只是为了文章的目的而简洁 什么“细胞”?分配的内存malloccalloc 可用于存储任何类型的对象。您是否假设分配的空间将用于存储指针值? 【参考方案1】:

不,它们并不总是等效,但在大多数流行的机器上你会没事的。 calloc 将一个全零位模式写入分配的内存,但空指针值在某些机器上可能不是全位零(甚至对于某些机器上的某些类型)。

查看 C 常见问题解答的 Null Pointers 部分以获取大量信息。

【讨论】:

【参考方案2】:

NULL 不能保证所有位都设置为 0,即使它总是比较等于整数常量 0。

Calloc 会将所有位设置为 0,就像调用 memset 一样。允许结果值比较不等于 NULL。

因此它们不等价。

【讨论】:

以上是关于calloc() 和 NULL的主要内容,如果未能解决你的问题,请参考以下文章

C ++中的“new”和“malloc”和“calloc”有啥区别? [复制]

哪个更优化:`new` 或 `calloc`? [复制]

堆的分配和释放(malloc,free,calloc,realloc)

动态内存分配的补充 realloc和calloc函数

malloc和calloc用法

malloc 和 calloc 与 std::string 的区别