03程序设计基础__C++程序结构和内存分配

03程序设计基础__C++程序结构和内存分配

ID:36335260

大小:474.50 KB

页数:25页

时间:2019-05-09

03程序设计基础__C++程序结构和内存分配_第1页
03程序设计基础__C++程序结构和内存分配_第2页
03程序设计基础__C++程序结构和内存分配_第3页
03程序设计基础__C++程序结构和内存分配_第4页
03程序设计基础__C++程序结构和内存分配_第5页
资源描述:

《03程序设计基础__C++程序结构和内存分配》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、第三讲:程序设计基础VC++程序结构及内存分配2可执行程序的结构代码区(textsegment)存放CPU执行的机器指令(machineinstructions)代码区是只读的规划了局部变量的相关信息全局数据区/静态数据区已初始化的全局变量静态变量和常量数据可执行代码可执行文件结构数据区代码区3进程的结构如果将某个可执行文件加载到内存运行,则将成为一个进程栈区堆区已初始化全局变量静态变量和常量数据数据区可执行代码代码区已初始化全局变量静态变量和常量数据可执行代码可执行文件结构数据区代码区进程结构数据在内存中的存储程序执行时的四个数据区全局变量、静态变量、字符串常量、常变量存放在全局数据区所

2、有的函数和代码存放在代码区为运行函数而分配的函数参数、局部变量存放在栈区;堆区用于动态内存分配。变量的生存期为从产生到消失的时期。全局变量、静态变量、常变量生存周期为整个程序的生存周期, 因此称为静态生存期;局部变量的生存周期起于函数调用,结束于函数调用结束, 其生存期是动态的,因此称为动态生存期。全局数据区注意:常变量、全局变量、局部静态变量、字符串常量在程序运行前在全局数据区进行分配。并且依次按照常变量、全局变量、局部静态变量的顺序从低地址向高地址分配。常变量按定义的先后次序分配,全局变量、局部静态变量也一样。变量a变量b6字符串常量7Hello.字符数组及字符串常量arrHell

3、o.8随着函数的调用,操作系统在栈区为被调函数的局部变量分配空间。从高地址向低地址分配。一旦某个函数执行结束,为局部变量分配的空间将被系统收回,所以,局部变量也就消亡了。因此,栈区中已分配空间的最上面部分,保存的是当前正在执行的函数的局部变量。栈区9堆区空间的分配和回收注意:堆空间不是系统为程序自动分配的,它是程序执行过程中由new语句为变量申请的,系统根据申请的先后顺序,从低地址向高地址分配。即使指向堆空间的指针变量消失,new语句申请的空间也不会消失。new语句申请的空间由delete语句释放。char*p=newchar[26];//申请26个字节的空间delete[]p;//释

4、放p指向的空间p=NULL;//将p置为NULL10动态数组1112运行栈工作原理C++变量在运行时依靠地址加以区分。定义全部写在函数以外的变量叫做全局变量;定义在函数之内的叫做局部变量。全局变量在目标代码中都是用一个唯一确定的地址定位的。然而,对于局部变量却不能如此,这是因为:(1)局部变量只在调用它所在的函数时才会生效,一旦函数返回后就会失效。(2)当发生递归调用时,会存在当一个函数尚未返回、对它的另一次调用又发生的情况,对于这种多次调用,相同名称的局部变量会有不同的值,这些值必须同时保存在内存之中,而且不能相互影响,因此它们必然有不同的地址,像全局变量那样分配唯一确定的地址肯定是

5、行不通的。13运行栈工作原理函数形参的情形与局部变量非常相似,需要存储在一种特殊的结构中,这就是栈。栈顶栈底…a2a1an压入栈弹出栈图3-8栈的示意图14运行栈工作原理intfun2(intm){returnm*m;}intfun1(intx,inty){returnfun2(x)+fun2(y);}intmain(){inta,b;cout<<"Pleaseentertwointegers(aandb)";cin>>a>>b;cout<<"Thesumofsquareofaandb"<< fun1(a,b)<

6、早开始的调用返回得越晚。函数调用中的形参和局部变量,当调用开始时生效,当函数返回后即失效,它们有效的期间与函数调用的期间是重合的。函数的形参和局部变量,可以用栈来存储,这种栈叫做运行栈。(早进晚出)16longfac(intn){longf;if(n==0)f=1;elsef=fac(n-1)*n;returnf;}voidmain(){longfac(intn);intn;longy;cout<<"Enterapositiveinteger:";cin>>n;y=fac(n);cout<

7、1main()栈顶y:?n:1f:?n:0f:1n:1fac(0)fac(1)main()栈顶f:1y:?n:1n:1fac(1)main()栈顶f:?y:?n:1n:1fac(1)main()栈顶(a)main()调用fac(1)前(b)main()调用fac(1)后(c)fac(1)调用fac(0),fac(0)返回前(d)fac(1)返回前(e)main()返回前图3-9例3-8中的运行栈变化情况18函数调用的执行

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

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

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