malloc/calloc分配的块的区别

4

可能是重复问题:
malloc和calloc之间的区别

尽管calloc以块形式分配内存,而malloc以单个块形式分配内存,但它们都连续地分配内存。如果存在障碍,那么calloc能否跨越障碍并在剩余的堆内存中分配另一个块?我希望在这个问题上有清晰的解释。

2个回答

9
两个函数都在一个连续的块中分配内存。参数上的差异并不反映底层分配策略的差异,这只是历史上的不一致性。
(您可以通过推理得出这个结论。如果 calloc 分配的是非连续的块,调用者如何知道空洞在哪里以及如何跳过它们?调用者只收到一个单独的指针。而不是像访问非连续区域所需的块的链接列表。)
您可以使用 calloc(n,s)malloc(n*s) 中的任意一个函数;calloc会为您进行乘法运算,仅此而已。如果需要,您可以将参数切换为 calloc(s,n) 。它分配 "s" 个大小为 "n" 的对象只是一个概念上的说法,系统实际上不会跟踪或强制执行这个规则。 calloc(4,1) 等同于 calloc(1,4) 等同于 calloc(2,2)
两者之间唯一有意义的区别是 calloc 将内存设置为零。 malloc 不初始化内存,因此如果您不需要清除内存,则更有效率。

你好John, 所以,malloc(s)返回一个指针,其中包含s字节的足够存储空间,而calloc(n,s)返回一个指针,其中包含足够连续存储空间,每个存储空间都有s字节...所以这里calloc返回n个连续的s字节块,而malloc返回一个s字节的单一块...如果我错了,请纠正我。 - Addtoc

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

是的...由于calloc函数可以当作malloc和memset的结合使用。 - Addtoc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接