最可以解释一下堆和栈?

fangjianbin 2001-11-08 10:33:58
我在做一个项目时遇到栈溢出的问题,谁能就堆和栈作一个权威解释?
...全文
105 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
beijingshizi 2002-01-06
  • 打赏
  • 举报
回复
明白了,谢谢
leizhengdeng 2002-01-06
  • 打赏
  • 举报
回复
看看horsehorse(tigertiger)
不过我想问一下UNIX下全局区多大?
zhuang094 2002-01-05
  • 打赏
  • 举报
回复
呵呵~~~
我不是大明 2002-01-05
  • 打赏
  • 举报
回复
值得一读!
forest 2002-01-05
  • 打赏
  • 举报
回复
nichang说的挺清楚啊
horsehorse 2001-11-08
  • 打赏
  • 举报
回复
每调用一次函数,调用入口的现场(寄存器值、返回地址等)都会压入堆栈,然后再压入函数参数,再在堆栈中分配函数中定义的动态变量所需空间。函数退出时反操作。
堆栈溢出一般有以下情况:
1、在函数中定义了大数组。解决方法:a、改为用new在堆中分配。b、使用静态数组或全局数组。
2、函数的递归调用。解决方法:a、调整堆栈大小(VC缺省为1MB,可设置)。b、不需要在递归过程中保留的变量均定义为静态变量。
fangjianbin 2001-11-08
  • 打赏
  • 举报
回复
那请问如果我有一个函数调一个函数,是否栈被的使用就越来越多呢?
leizhengdeng 2001-11-08
  • 打赏
  • 举报
回复
从寻址方式来讲,栈比堆快,但是在需要分配大内存时,请用堆,不要开很大的数组。
kingzai 2001-11-08
  • 打赏
  • 举报
回复
堆是很大的内存块,用以在运行时分一些小单元。在我们写程序时,如果我们还不知道所需内存的大小,就可以使用堆.动态内存分配函数是标准C 库的一部分,包括malloc( )、calloc( )、
realloc( )和free( )。
注意,C 堆管理器相当重要,它给出内存块,对它们使用free( )时就回收它们。没有对堆
进行合并的工具,如果能合并就可以提供更大的空闲块。如果程序多次分配和释放堆存储,最
终会导致这个堆有大量的空闲块,但没有足够大且连续的空间能满足我们对内存分配的需要。
如果在栈上创建一个变量,那么这个变量的存储单元由编译器自动开辟和释放。
编译器准确地知道需要多少存储容量,根据这个变量的活动范围知道这个变量的生命期。而对
动态内存分配,编译器不知道需要多少存储单元,不知道它们的生命期,不能自动清除。因此,
程序员应负责用free( )释放这块存储,free( )告诉堆管理器,这个存储可以被下一次调用的
malloc( )、calloc( )或realloc( )重用。
nichang 2001-11-08
  • 打赏
  • 举报
回复
我英语不太好,请多包涵。

C++包括两种被应用程序管理的内存区域:一种称为栈(stack),另一种称为堆(heap)。
stack是函数被调用时自动分配的一块内存区域,它主要用于保留函数内使用的变量及函数调用位置处下一条代码的地址。
stack是后进先出,一个可变的指针指向stack的顶部。
本质上,当一个函数被程序调用时,当前的执行地址被放入stack,如果有参数传递到函数内,这些参数也被压入stack,如果函数内有变量,它们也被压入stack,如果函数执行时调用另一个函数,重复上面的过程。
当从函数返回时,stack指针指向存放先前执行地址的位置,也就是说,stack空间内分配的元素已被删除。这就是为什么函数内的变量此时无效,因为它们已经被推出了stack,另外要注意的是,声明一个静态变量,它没有进入stack中。
另一种由应用程序管理的内存区域是堆(heap),heap是储存应用程序的内存分配需求,并且分离于程序代码和stack,heap中分配的对象的总的空间受限于计算机系统中有效的虚拟内存。
C程序通常使用malloc和free分配和回收heap内存,在C++中,使用new和delete.
GaoYang 2001-11-08
  • 打赏
  • 举报
回复
是一个后进先出的概念。当事先申请的空间备用完了以后,再往其中添加数据,就会说“溢出”了。具体的实现方法,你可以根据你想用的语言,查相应语言的数据结构的书。
caimouse 2001-11-08
  • 打赏
  • 举报
回复
最权威的解释问MS吧.
一般的解释看看操作系原理和编译原理就可以了.
yinx 2001-11-08
  • 打赏
  • 举报
回复
不知,可以看看ms的站点
fangjianbin 2001-11-08
  • 打赏
  • 举报
回复
请问各位,您们知道WinCE却省的Stack是多大? 如何知道栈大小吗? 我的问题是发生WinCE上的,在PC的没问题.

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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