【问题标题】:Difference in block allocated by malloc/calloc [duplicate]malloc / calloc分配的块差异[重复]
【发布时间】:2012-10-08 03:01:18
【问题描述】:

可能重复:
c difference between malloc and calloc

虽然 calloc 以块的形式分配内存,malloc 在单个块中分配内存,它们是否都连续分配内存,如果有障碍物,calloc 是否能够跳过障碍物,然后在剩余的堆内存中分配另一个块。我想弄清楚这件事。

【问题讨论】:

    标签: c


    【解决方案1】:

    这两个函数都在一个连续的块中分配内存。参数的差异并不反映底层分配策略的差异。这是历史上的不一致,仅此而已。

    (你可以推断出这个结论。如果 calloc 分配不连续的块,调用者如何知道漏洞在哪里以及如何跳过它们?调用者收到的只是一个指针。不是,比如说,一个块的链表,这是访问非连续区域所需要的。)

    您可以拨打calloc(n,s)malloc(n*s); calloc 为你做乘法,就是这样。如果需要,您可以将参数切换为 calloc(s,n)。它分配大小为“n”的“s”对象的想法只是一个概念性的想法,系统实际上并没有跟踪或强制执行它。 calloc(4,1) 等价于calloc(1,4) 等价于calloc(2,2)

    两者之间唯一有意义的区别是 calloc 将内存设置为零。 malloc 使其未初始化,因此如果您不需要清除内存,它会更有效。

    【讨论】:

    • 嗨 John,所以,malloc(s) 返回一个具有足够存储空间且具有 s 字节的指针,而 calloc(n,s) 返回具有足够连续存储空间的指针,每个具有 s 字节......所以这里 calloc 正在返回 n 个连续的 s 字节块,而 malloc 正在返回单个 s 字节块......如果我错了,请纠正我。
    【解决方案2】:

    正如约翰所说,由于历史原因存在差异,分配策略没有实际差异。不过,值得指出的一个区别是calloced 内存将设置为零,而malloc 返回一个指向未初始化内存的指针。

    【讨论】:

    • 是的...因为 calloc 是 malloc 和 memset 的组合形式。
    猜你喜欢
    • 2020-11-26
    • 2018-06-12
    • 1970-01-01
    • 2014-07-01
    • 2011-07-03
    • 1970-01-01
    • 2012-11-11
    • 2018-06-17
    • 2012-12-02
    相关资源
    最近更新 更多