【问题标题】:When should i use calloc over malloc我什么时候应该在 malloc 上使用 calloc
【发布时间】:2011-12-27 18:03:16
【问题描述】:

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

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

【问题讨论】:

    标签: c pointers dynamic-memory-allocation


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        在某些情况下,您正在为某个结构分配内存,而该结构的某些成员可能会在 some expression 或 conditional statement 中进行评估,而无需初始化该结构在这种情况下,这将是有害的,或者会给您带来不确定的行为。所以克服这个更好的你

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

        或

        2> calloc that structure  
        

        注意:一些使用 malloc 的高级内存管理程序也会用 0 重置内存

        【讨论】:

          【解决方案4】:

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

          一些例子:

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

          【讨论】:

          • 标准不保证您的第三点。内存初始化为所有位为零,这可能与空指针常量不对应。
          【解决方案5】:

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

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

          如果您的程序不分配大块(即几十兆字节),则在 malloc 中花费的时间远大于将其归零的时间。

          【讨论】:

            猜你喜欢
            • 2010-12-30
            • 2011-07-26
            • 1970-01-01
            • 1970-01-01
            • 2021-09-07
            • 2011-08-08
            • 2012-09-22
            • 1970-01-01
            相关资源
            最近更新 更多