可能重复:
c malloc 和 calloc 之间的区别
虽然 calloc 以块和 malloc 的形式在单个块中分配内存,但它们是否都连续分配内存,如果有障碍物,calloc 是否能够跳过障碍物,然后在剩余的堆内存中分配另一个块。我想弄清楚这件事。
可能重复:
c malloc 和 calloc 之间的区别
虽然 calloc 以块和 malloc 的形式在单个块中分配内存,但它们是否都连续分配内存,如果有障碍物,calloc 是否能够跳过障碍物,然后在剩余的堆内存中分配另一个块。我想弄清楚这件事。
这两个函数都在一个连续的块中分配内存。参数的差异并不反映底层分配策略的差异。这是历史的矛盾,仅此而已。
(你可以推断出这个结论。如果 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 使其未初始化,因此如果您不需要清除内存,它会更有效。
正如约翰所说,由于历史原因存在差异,分配策略没有实际差异。不过,值得指出的一个区别是calloc
ed 内存将被设置为零,同时malloc
返回一个指向未初始化内存的指针。