我什么时候应该使用calloc而不是malloc
这是Beej的C指南 “使用calloc()的缺点是清除内存需要时间,而且在大多数情况下,您不需要清除内存,因为您只需要在上面写。但是,如果您发现自己将一个块malloc()化,然后立即将内存设为零,您可以使用calloc()在一次调用中完成此操作。”我什么时候应该使用calloc而不是malloc,c,pointers,dynamic-memory-allocation,C,Pointers,Dynamic Memory Allocation,这是Beej的C指南 “使用calloc()的缺点是清除内存需要时间,而且在大多数情况下,您不需要清除内存,因为您只需要在上面写。但是,如果您发现自己将一个块malloc()化,然后立即将内存设为零,您可以使用calloc()在一次调用中完成此操作。” 那么,当我想将内存清除为零时,可能出现的情况是什么呢?一种情况是,分配一个整数数组(例如,作为累加器或计数器变量),并且希望数组中的每个元素从0开始 当函数向其文档中的状态传递缓冲区时,缓冲区必须为零填充。为了安全起见,您也可以始终将内存归零;除
那么,当我想将内存清除为零时,可能出现的情况是什么呢?一种情况是,分配一个整数数组(例如,作为累加器或计数器变量),并且希望数组中的每个元素从0开始 当函数向其文档中的状态传递缓冲区时,缓冲区必须为零填充。为了安全起见,您也可以始终将内存归零;除非缓冲区真的很大,否则实际上不会花那么多时间。内存分配本身是操作中潜在的昂贵部分。很多时候,您可能希望内存归零 一些例子:
- 分配内存以包含一个结构,在该结构中您需要所有 议员草签为零
- 为稍后要写入一些字符的字符数组分配内存,然后将其视为NULL 终止字符串
- 为要初始化为NULL的指针数组分配内存
1> malloc that structure and memset it with 0 before using that structure
或
注意:一些使用malloc的高级内存管理程序也会使用0重置内存。如果所有分配的内存都是零填充的,则程序的行为更具可复制性(因此,如果重新运行程序,该行为更可能相同)。这就是为什么我不使用未初始化的malloc区域
(由于类似的原因,在Linux上调试C或C++程序时,我通常会执行<代码> ECHO 0 >/PRO/sys/内核/随机化VAX空间< /> >,使<>代码> MMAP行为更可复制。p>
如果您的程序没有分配巨大的块(即几十兆字节),那么在malloc中花费的时间远远大于将其归零的时间 你的第三点没有得到标准的保证。内存初始化为所有位零,这可能与空指针常量不对应。
2> calloc that structure