更喜欢使用malloc而不是calloc

13

可能是重复的问题:
c malloc和calloc之间的区别

在什么情况下,您会更喜欢使用malloc而不是calloc。我知道malloc和calloc都可以动态分配内存,并且calloc还将分配的所有内存位初始化为零。 从这个角度来看,我猜总是最好使用calloc而不是malloc。或者有一些情况下malloc更好吗?性能可能会更好吗?


投票重新开放这个问题。另一个问题是关于差异的。这个问题不同。它询问为什么人们更喜欢使用malloc(这是一种常见做法)。 - Raymond Hettinger
@RaymondHettinger,如果我没记错的话,这并不重要,即使他们的答案相同。 - Cristian Ciupitu
3个回答

26
如果您需要动态分配的内存进行零初始化,那么请使用calloc
如果您不需要动态分配的内存进行零初始化,则使用malloc
您并不总是需要零初始化的内存;如果您不需要内存进行零初始化,则不要花费初始化它的成本。例如,如果您分配内存,然后立即复制数据以填充已分配的内存,那么就没有任何理由执行零初始化。 callocmalloc是执行不同操作的函数:请使用最适合您需要完成的任务的那一个。

谢谢。性能是一个很好的点。我也想知道是否还有其他可能的原因。 - user514946
1
唉...他们关闭了你的问题,这与“重复”略有不同...我有时候讨厌S.O.。无论如何,您可能希望使用calloc而不是malloc有几个原因。其中一个是像valgrind这样的程序将发出许多潜在的虚假警告。另一个与暴露错误有关。使用未初始化的内存可能会导致不稳定的行为,这可能会使您注意到一个错误,否则如果您使用calloc,则可能会被忽略。 - SO Stinks

2
依赖于calloc的零初始化可能会很危险,如果你不小心的话。清零内存对于整数类型来说会得到0,对于字符类型来说会得到\0,这是预期的。但它并不一定对应于浮点/双精度0或NULL指针。

1

通常你会分配内存来存储某些内容。这意味着calloc初始化的(至少大部分)空间很快就会被其他值覆盖。因此,多数代码使用malloc,既能提高一点速度,又不会有实际损失。

我几乎唯一见过calloc的用法是用于测试Java相对于C++的速度。在C++版本中,它使用calloc分配了一些内存,然后使用memset重新初始化内存,以明显地试图制造偏向Java的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接