我什么时候应该使用calloc而不是malloc

时间:2011-11-12 19:00:08

标签: c pointers dynamic-memory-allocation

这是来自Beej的C指南 “使用calloc()的缺点是清理内存需要时间,在大多数情况下,你不需要清楚,因为你无论如何都要写它。但是如果你发现自己是malloc ()一个块,然后将内存设置为零,你可以使用calloc()在一次调用中执行此操作。“

那么当我想要将内存清零时,有什么可能的情况。

5 个答案:

答案 0 :(得分:9)

当您将缓冲区传递给其文档中的状态时,缓冲区必须为零填充。为了安全起见,您也可能始终将内存归零;除非缓冲区真的很大,否则它实际上并不需要那么多时间。内存分配本身是操作中可能很昂贵的部分。

答案 1 :(得分:6)

一种情况是你要分配一个整数数组(比如,作为累加器或计数器变量),你希望数组中的每个元素都从0开始。

答案 2 :(得分:2)

在某些情况下,您为某个结构分配内存,而该结构的某些成员可能会在某个表达式条件语句中进行评估,而不会初始化该结构在这种情况下,它将是有害的或将给你未定义的行为。因此,克服这种情况做得更好

1> malloc that structure and memset it with 0 before using that structure 

2> calloc that structure  

注意:一些带有malloc的高级内存管理程序也会将内存重置为0

答案 3 :(得分:0)

很多时候你可能希望将内存归零!

一些例子:

  • 分配内存以包含您想要所有内容的结构 成员初始化为零
  • 为一个字符数组分配内存,你稍后会将一些字符写入,然后视为NULL 终止字符串
  • 为要初始化为NULL的指针数组分配内存

答案 4 :(得分:0)

如果所有已分配的内存都是零填充,则程序的行为可重现性更高(因此,如果重新运行程序,则行为更可能相同)。这就是为什么我不使用未初始化的malloc区域。

(出于类似的原因,在Linux上调试C或C ++程序时,我通常会echo 0 > /proc/sys/kernel/randomize_va_space,以便mmap行为更具可重复性。

如果你的程序没有分配巨大的块(即几十兆字节),那么在malloc中花费的时间远远大于将它归零的时间。