Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我什么时候应该使用calloc而不是malloc_C_Pointers_Dynamic Memory Allocation - Fatal编程技术网

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

我什么时候应该使用calloc而不是malloc,c,pointers,dynamic-memory-allocation,C,Pointers,Dynamic Memory Allocation,这是Beej的C指南 “使用calloc()的缺点是清除内存需要时间,而且在大多数情况下,您不需要清除内存,因为您只需要在上面写。但是,如果您发现自己将一个块malloc()化,然后立即将内存设为零,您可以使用calloc()在一次调用中完成此操作。” 那么,当我想将内存清除为零时,可能出现的情况是什么呢?一种情况是,分配一个整数数组(例如,作为累加器或计数器变量),并且希望数组中的每个元素从0开始 当函数向其文档中的状态传递缓冲区时,缓冲区必须为零填充。为了安全起见,您也可以始终将内存归零;除

这是Beej的C指南 “使用calloc()的缺点是清除内存需要时间,而且在大多数情况下,您不需要清除内存,因为您只需要在上面写。但是,如果您发现自己将一个块malloc()化,然后立即将内存设为零,您可以使用calloc()在一次调用中完成此操作。”


那么,当我想将内存清除为零时,可能出现的情况是什么呢?

一种情况是,分配一个整数数组(例如,作为累加器或计数器变量),并且希望数组中的每个元素从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