问:堆和栈 的区别在哪里?

searoom 2005-03-23 10:25:03
堆和栈 的区别在哪里?

哪些变量会在栈中分配空间,哪些变量会在堆中分配空间?
...全文
499 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
yhq520 2005-04-03
  • 打赏
  • 举报
回复
在存储的物理意义上是不样的
xjp6688 2005-03-27
  • 打赏
  • 举报
回复
这个比较详细了,应该加入FAQ,哈哈
yearn1900 2005-03-27
  • 打赏
  • 举报
回复
名称不同
panwai 2005-03-27
  • 打赏
  • 举报
回复
学习!
williamVII 2005-03-26
  • 打赏
  • 举报
回复
good question
surstar 2005-03-26
  • 打赏
  • 举报
回复
都回答很全了,学习~
dongpy 2005-03-26
  • 打赏
  • 举报
回复
堆和栈 的区别在哪里?
======================================================================================
堆和栈是编译器划分的内存空间。

栈上分配的内存,编译器会自动收回;堆上分配的内存,要通过free来显式地收回。


哪些变量会在栈中分配空间,哪些变量会在堆中分配空间?
=======================================================
函数局部变量、参数,一些临时对象都在栈中分配空间。

用malloc、calloc等申请的内存在堆中分配。
nodummy 2005-03-26
  • 打赏
  • 举报
回复
回复人: EnochShen(小疯子:真的好菜—知耻而后勇!) ( ) 信誉:106

=============================
新一代的抢分狂……VC/MFC抢到2星了居然还跑到C/C++来抢……
sankt 2005-03-26
  • 打赏
  • 举报
回复
学习
nodummy 2005-03-26
  • 打赏
  • 举报
回复
堆和栈其实是两种数据结构……

只不过系统的进程空间管理引用了这两种结构,所以空间被分成了堆和栈……
Student02370236 2005-03-26
  • 打赏
  • 举报
回复
栈空间的分配通常要受到操作系统的限制,因为栈的分配是从高地址到底地址;而堆空间的分配是从底地址到高地址,所以一般不会受到限制。虽然栈的空间有限,但是其访问速度比堆快,而堆的使用更为灵活...
gnixemos 2005-03-26
  • 打赏
  • 举报
回复
所以递归函数中局部内存也申请在堆上
或者可以的话用静态变量
gnixemos 2005-03-26
  • 打赏
  • 举报
回复
递归是容易出现栈溢出的情况
如果函数中分配内存的话
gnixemos 2005-03-26
  • 打赏
  • 举报
回复
栈可以扩大
vc 编译选项中可以设置,其实就是一个 /STACK参数

缺省2M
searoom 2005-03-26
  • 打赏
  • 举报
回复
有个疑惑哦:如果栈那么小,那使用递归函数不是很容易就撑破了么?比如递归循环个几千次
rocklabzhang 2005-03-26
  • 打赏
  • 举报
回复
老问题
经典的问题
领分
cssport2000 2005-03-26
  • 打赏
  • 举报
回复
不是很清楚区别啊!
  • 打赏
  • 举报
回复

栈是系统自动为之分配的,例如当在调用涵数时,需要保存的变量,最明显的是在递归调用时,要系统自动分配一个栈的空间,后进先出的,而后又由系统释放这个空间,
堆是自已申请自已释放,如p1 = (char *)malloc(10);
在C++中用new运算符
如p2 = (char *)malloc(10);
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,
会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
zhousqy 2005-03-26
  • 打赏
  • 举报
回复
動態分配的內存在堆里。
lj197912 2005-03-26
  • 打赏
  • 举报
回复
局部变量,函数形参是存储在栈上的,由系统帮你管理
程序员通过new分配的内存,是在堆上的,要由自己用delete来释放
加载更多回复(2)

70,020

社区成员

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

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