【发布时间】:2012-10-08 03:01:18
【问题描述】:
虽然 calloc 以块的形式分配内存,malloc 在单个块中分配内存,它们是否都连续分配内存,如果有障碍物,calloc 是否能够跳过障碍物,然后在剩余的堆内存中分配另一个块。我想弄清楚这件事。
【问题讨论】:
标签: c
虽然 calloc 以块的形式分配内存,malloc 在单个块中分配内存,它们是否都连续分配内存,如果有障碍物,calloc 是否能够跳过障碍物,然后在剩余的堆内存中分配另一个块。我想弄清楚这件事。
【问题讨论】:
标签: c
这两个函数都在一个连续的块中分配内存。参数的差异并不反映底层分配策略的差异。这是历史上的不一致,仅此而已。
(你可以推断出这个结论。如果 calloc 分配不连续的块,调用者如何知道漏洞在哪里以及如何跳过它们?调用者收到的只是一个指针。不是,比如说,一个块的链表,这是访问非连续区域所需要的。)
您可以拨打calloc(n,s) 或malloc(n*s); calloc 为你做乘法,就是这样。如果需要,您可以将参数切换为 calloc(s,n)。它分配大小为“n”的“s”对象的想法只是一个概念性的想法,系统实际上并没有跟踪或强制执行它。 calloc(4,1) 等价于calloc(1,4) 等价于calloc(2,2)。
两者之间唯一有意义的区别是 calloc 将内存设置为零。 malloc 使其未初始化,因此如果您不需要清除内存,它会更有效。
【讨论】:
正如约翰所说,由于历史原因存在差异,分配策略没有实际差异。不过,值得指出的一个区别是calloced 内存将设置为零,而malloc 返回一个指向未初始化内存的指针。
【讨论】: