c/c++中堆与栈的区别和应用

c/c++中堆与栈的区别和应用

ID:13155533

大小:24.00 KB

页数:6页

时间:2018-07-21

c/c++中堆与栈的区别和应用_第1页
c/c++中堆与栈的区别和应用_第2页
c/c++中堆与栈的区别和应用_第3页
c/c++中堆与栈的区别和应用_第4页
c/c++中堆与栈的区别和应用_第5页
资源描述:

《c/c++中堆与栈的区别和应用》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C/C++中堆与栈的区别和应用2007年4月第24卷第2期长治学院JournalofChangzhiUniversityApr.,2007Vo1.24.No.2C/C++中堆与栈的区别和应用张伟(长治职业技术学院,山西长治046011)摘要:在C/C++中我们常把堆和栈合称为堆栈,但实际上,堆和栈虽同处于内存的动态存储区,却有着完全不同的分配方式.文章从几个简单的程序入手,对堆和栈进行一些探讨.关键词:指针;堆;栈;内存泄漏中图分类号:TP311.1文献标识码:B文章编号:1673—2014(2007)02—0046-021引言先看一个有关链表的简单程序:【程序一】:#inclu

2、de"stdio.h''typedefstructnode{intdata;structnodenext;}lnode,*nodelist;nodelistcreatlist(nodelistl,intn){nodelistS;infl;for(i=O;i<n;i++)(s=(nodelist)malloc(sizeof(1nale));scanf("%d",&s一>data);s一>next=l一>next;1一>next=s:}retuml;}voidprinmode(nodelist1){nodelistp=l一>next;whf

3、le~)fpfinff("%d",p->data);p=p->next;}}main()fnodelisthead;intx:scanfC'%d..,&x);head=(nodelist)malloc(sizeof(1node));head一>next=NULL;head=creaflist(head,x);printnode(head);}在这个程序中,主函数main()调用函数createlist()创建了一个长度为x的链表,然后函数printnode()输出链表中各结点.但问题是,当被调函数执行完回到主调函数时,其被调用时所分配的空间将全部释放,c

4、reatelist()和printnode()同为main()的被调函数,createlist()中创建的链表在返回main()后应不再存在了,那么用printnode()输出肯定是错误的.显然,程序是有问题的.但事实上,该程序可以正常运行并输出结果.出现以上问题的原因,就是编程者没有正确理解C语言中的堆空间(heap)和栈空间(stack).2正确理解"堆"和"栈"在c/c++中我们常提到堆栈,其实堆和栈是不同的存储空间.一般,c/c++编译的程序占用的内存可分为:程序代码区,静态存储区和动态存储区.堆和栈都位于动态存储区,但二者有诸多不同.栈空间是静态分配的,如:函数的参数,

5、局部变量等,系统会根据其大小预先在栈中自动分配适当的内存空间,这一部分在其生存期内是固定不变的.而堆空间是动态分配,程序员可根据需要申请并指明大小,不用时可释放收回,如在C中用malloc()函数或在c++中用new运算符申请的空间.另外,栈是由高地址向低地址扩展的数据结构,是一块连续的内存区域.也就是说栈的最大容量是系统预先定好的,在Windows下栈的大小是2M(系统不同,栈的大小也可能不同,总之是一个在编译时就确定的常数),如果申请的空间超过栈的剩余空间,将提示Overflow!所以,能从栈获得的空间较小.而堆是一种由低地址向高地址扩展的数据结构,可以是不连续的内存空间(操

6、作系统用链表来存储空闲的内存地址).堆的大小只受限于计算机系统中有效的虚拟内存大小(理论上足够大).由此可见,堆的空间比较灵活,也比较大.3堆和栈的应用举例【程序二】:收稿日期:20O6_l1—15作者简介:张伟(1975一),男,山西长治人,讲师,主要从事计算机教学与研究.?46?张伟C/c++中堆与栈的区别和应用#include"stdio.h''intmax(intx,inty)fintZ;if(x>y)z=x;elsez=y;returnZ;}main()finta,b,e;seaM("%d%d..,&a,&b);e~max(a,b);prinff(

7、"Max=%d",c);}程序二在栈中的空间分配过程:开始时栈为空栈,程序执行,系统调用main()函数,为main()函数开辟栈空间,用于存放操作系统的当前状态和返回地址,以及局部变量a…be当执行到语句e~max(a,b)时,则调用函数max(),这时又要在栈中为max()函数开辟栈空间,用于存放main()函数当前状态和返回地址,以及形参x.y和局部变量z.当max()执行完后,要释放刚才分配给max()函数的栈空间,到了main()执行完时,则要释放分配给main()函数

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。