malloc分配的内存是连续的吗?与calloc有什么本质区别?calloc从哪分配内存

ls251544415 2010-11-09 09:07:29
malloc从堆上分配内存
资料上说,而堆中的内存不是连续的,是以链表形式存在的

还有calloc是从哪里分配的内存?堆or栈?

calloc分配一片连续的存储空间,并全部清零。
如果malloc分配的内存也是连续的,那么calloc因为多个清零的功能而被设计出来,不是有点多此一举吗?
...全文
1243 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gucasaoe1234 2011-08-25
  • 打赏
  • 举报
回复
学习了~~
xuwening 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jim_king_2000 的回复:]

1、malloc分配的内存是连续的。
2、堆中的内存不一定是连续的。而是一块一块以链表的形式存在的。而链表中的每一个节点(即一块)都是连续的。
3、分配算法是,找到合适大小的一块,分配给用户,如果没有,则把大块的切正两小块。用户释放后,需要进行小块内存的合并。
4、不要小看calloc的清零功能,它是经过优化的,你自己清零不会比它快。
[/Quote]

说的太明白了~~~~~~~~~~~
旭子 2010-11-10
  • 打赏
  • 举报
回复
操作系统段页式保护, 使得段连续页不连续
在标准库再次基础上在抽象了一层,标准库内有自己的内存分配设计,malloc 本身就实现了内存分配池,以应付频繁的小块内存申请和释放,而不需要每次都返回内核,从而提高性能。
东大坡居士 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jim_king_2000 的回复:]
1、malloc分配的内存是连续的。
2、堆中的内存不一定是连续的。而是一块一块以链表的形式存在的。而链表中的每一个节点(即一块)都是连续的。
3、分配算法是,找到合适大小的一块,分配给用户,如果没有,则把大块的切正两小块。用户释放后,需要进行小块内存的合并。
4、不要小看calloc的清零功能,它是经过优化的,你自己清零不会比它快。
[/Quote]

学习了~~~~~~~~
ischarles 2010-11-09
  • 打赏
  • 举报
回复
p= calloc(m, n) 等价于 p = malloc(m*n); memset(p, 0, m*n);
也就是说,calloc除了分配内存外还做了把分配的区域初始化为0的工作
沭水河畔 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lhcwjy 的回复:]

malloc和calloc都是从堆从分配一块连续的内存。它们的功能是一样的,只是参数不同。
[/Quote]
alloca是从栈上分配,无需free。

The alloca() function allocates size bytes of space in the stack frame of the
caller. This temporary space is automatically freed when the function that called
alloca() returns to its caller.
白云飘飘飘 2010-11-09
  • 打赏
  • 举报
回复
malloc和calloc都是从堆从分配一块连续的内存。它们的功能是一样的,只是参数不同。
Jim_King_2000 2010-11-09
  • 打赏
  • 举报
回复
1、malloc分配的内存是连续的。
2、堆中的内存不一定是连续的。而是一块一块以链表的形式存在的。而链表中的每一个节点(即一块)都是连续的。
3、分配算法是,找到合适大小的一块,分配给用户,如果没有,则把大块的切正两小块。用户释放后,需要进行小块内存的合并。
4、不要小看calloc的清零功能,它是经过优化的,你自己清零不会比它快。
BruCe1107 2010-11-09
  • 打赏
  • 举报
回复
类似于char* buffer = new char[100];

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧