4

可能重复:
c malloc 和 calloc 之间的区别

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

4

2 回答 2

9

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

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

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

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

于 2012-10-17T18:56:57.657 回答
1

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

于 2012-10-17T19:09:59.553 回答