我前几天刚刚了解了 C calloc()
函数。阅读了它的描述以及它与 malloc
(1、2)的不同之处后,我认为作为非嵌入式程序员,我应该始终使用 calloc()
。但事实真的如此吗?
我有一个保留意见是访问 calloc()
内存的额外延迟,但我也想知道是否存在从 malloc()
切换到calloc()
会以更严重的方式破坏程序。
P. S. calloc()
的零初始化方面对我来说非常清楚。我有兴趣了解的是 calloc()
和 malloc()
之间的另一个区别 - calloc()
提供的惰性内存分配.如果您只关注内存初始化方面,请不要发布答案。
最佳答案
这确实是一个视情况而定的决定。经验法则是
如果您首先写入分配的内存,
malloc()
更好(可能的开销更少)。示例:考虑以下场景
char * pointer = NULL; //allocation strcpy(pointer, source);
在这里,使用
malloc()
可以很好地进行分配。如果有可能使用分配的内存进行先读后写,请使用
calloc()
,因为它会初始化内存。通过这种方式,您可以避免调用 undefined behavior 的单元化内存先读后写场景的问题。 .例子:
char * pointer = NULL; //allocation strcat(pointer, source);
这里,
strcat()
需要第一个参数已经是一个string,使用malloc()
分配不能保证这一点。由于calloc()
对内存进行零初始化,它将在这里达到目的,因此,calloc()
是这种情况下的方法。
要详细说明第二种情况,请引用 C11
,第 7.24.3.1 章(关注我的重点)
The
strcat()
function appends a copy of the string pointed to bys2
(including the terminating null character) to the end of the string pointed to bys1
. The initial character ofs2
overwrites the null character at the end ofs1
. [....]
因此,在这种情况下,目标指针应该是指向字符串的指针。通过 calloc()
进行分配保证了使用 malloc()
进行分配时不能保证,正如我们从第 §7.22.3.4 章中所知
The
malloc
function allocates space for an object whose size is specified bysize
and whose value is indeterminate.
编辑:
建议使用 malloc()
而不是 calloc()
的一种可能情况是编写用于单元/集成测试的测试 stub 。在这种情况下,使用 calloc()
可以隐藏与后一种情况类似的潜在错误。
关于c++ - calloc 比 malloc 好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41263448/