



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C/C+程序的内存管理机制1. 分区管理一个由C/C+编译的程序占用的内存分为以下几个部分:(1) 栈区(stack) : 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈,地址由高向低延伸。 (2) 堆区(heap): 一般由程序员分配释放,由程序执行过程中动态申请分配的内存,地址由低向高延伸,与栈区正好相反。若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式类似于链表。 (3) 全局区(静态区static) :全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。(4) 文字常量区: 常量字符串就是放在这里的。程序结束后由系统释放。(5) 程序代码区: 存放函数体得二进制代码。如图1所示。图1 内存映象图如图所示,内存中的栈区处于相对较高的地址。栈地址是向下延伸的,栈中分配局部变量空间,堆区是向上增长的用于分配程序员申请的内存空间。另外还有静态区是分配静态变量,全局变量空间的;只读区是分配常量和程序代码空间的;以及其他一些分区。2. 概念说明与举例(1) 堆和栈数据结构课程讲解的堆栈是一种LIFO结构,即后进先出的结构,有时简称为栈。在现实生活中有许多实例,比如人们生活中穿衣和脱衣,如果每次只能穿一件或脱一件的话,就是这种结构。C语言在实现中很多地方使用了这种结构吗,比如函数调用等。堆是一种经过排序的树形数据结构,每个结点都有一个值。通常所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于堆的这个特性,常用来实现优先队列。然而C语言存储数据的堆和栈并不是数据结构的堆和栈,之所以要说数据结构的堆和栈是为了和后面要说的堆区和栈区区别开来。 下面就说说C语言程序内存分配中的堆和栈,这里有必要把内存分配也提一下,一般情况下程序存放在Rom或Flash中,运行时需要拷到内存中执行,内存会分别存储不同的信息。例1:五种内存区举例main.cpp#include #include int a = 0; /全局初始化区char *p1;/ 全局未初始化区main()int b; /栈char s = abc; /栈char *p2; /栈char *p3= 123456; /1234560在常量区,p3在栈上char *p4=abc;/bac0在常量区,p4在栈上static int c =0; /全局(静态)初始化区p1 = (char *)malloc(10);/ 堆p2 = (char *)malloc(20); /堆 图2 变量内存地址图2是上例运行后内存的映像。在上例中,变量a 和指针变量p1为外部变量,地址由高向低延伸。即全局(静态)初始化区的内存分配与栈相同。变量b; s,*p2, *p3和 *p4(图中未显示其地址)均为局部变量,按栈的操作方式分配内存,地址由高到低变化。在常量区,地址是随机分配的。上例中p3大于p4,即常量”123456”的地址比”abc”高。将上例中,删除static int c =0; /全局(静态)初始化区,改成如下形式,则地址又是p3小于p4。#include #include #include int a = 0; /全局初始化区char *p1;/ 全局未初始化区main()int b; /栈char s = abc; /栈char *p2; /栈char *p3= 123456; /1234560在常量区,p3在栈上char *p4=abc;/bac0在常量区,p4在栈上p1 = (char *)malloc(10);/ 堆p2 = (char *)malloc(20); /堆static float x,y;/全局(静态)初始化区printf(%f %f n,x,y);printf(%x %x,&x,&y);在堆区p1,p2先后申请分配内存,p1地址低,p2地址高。字符数组s与字符指针p3都进行了初始化:char s=”abc”;在栈区分配了4字节内存,s0=a,s1=b,s2=c,s3=0。char *p3= 123456; 字符串”123456”在常量区,占7字节空间,p3是该字符串的首址。(2) 内存中操作应注意的问题1) 字符串复制观察例2:例2:char str110,str215=1234567890abc;printf(%s%sn,str1,str2);strcpy(str1,str2);printf(%s%sn,str1,str2);运行结果如图3所示,但是出现了图3(b)的错误错误: (a) 运行结果(b) 出现的错误图3 例2运行结果和错误由于字符数组str110在前,地址高,str215在后,地址低,而str2长于str1,结果字符串复制后将要修改比str1更高的内存单元,虽然字符串复制成功,后果不可预料。2) 函数返回值是指针考察例3,求两个数较大者。例3:#include int max(int a,int b)return ab? a:b; /如果ab,返回a,否则返回b void main()int x=4,y=5;printf(The max of %d and %d is %dn,x,y,max(x,y);函数返回值为5,程序运行结果为:The max of 4 and 5 is 5函数中a和b均为局部变量,在栈区分配,尽管调用该函数才分配,返回时自动释放。但函数返回值是由堆栈(前面讲过,是数据结构中要学的内容)返回的,因而它的值是正确的。如果将max()函数改成如下形式:#include int *max(int a,int b)return ab? &a:&b;/如果ab,返回a的地址,否
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全培训行业发展概况
- 2025年宝应县卫生健康系统事业单位公开招聘专业技术人员37人模拟试卷及1套参考答案详解
- 2025北京林业大学附属实验小学招聘模拟试卷及答案详解(新)
- 2025年浙江温州市卫生健康委员会直属卫生健康单位面向社会公开招聘116人考前自测高频考点模拟试题及答案详解(全优)
- 2025年甘肃省平凉华亭市策底镇招聘专业化管理的村文书考前自测高频考点模拟试题附答案详解(典型题)
- 2025福建厦门夏商集团有限公司招聘2人模拟试卷有完整答案详解
- 安全培训自查自评报告课件
- 2025湖南省邵阳学院公开招聘事业编制人员22人模拟试卷及答案详解(易错题)
- 涂料印花课件
- 2025年度国家粮食和物资储备局直属联系单位和垂直管理系统事业单位招聘统一笔试河南工业大学考点考前自测高频考点模拟试题及一套完整答案详解
- 安平丝网知识培训课件
- 粤教粤科版(2024)小学科学一年级上册《常见的天气》教案
- 医院感染管理的重要性
- 2025年中石油英语试题及答案
- 口腔门诊客户投诉处理与管理
- 统编版(2024)八年级上册历史全册教材问题参考答案
- 《电工电子技术》课件-第1章 电路理论基础及分析方法
- 《无人机飞行控制技术》全套教学课件
- 四渡赤水军事教学课件
- 刚新修订《治安管理处罚法》培训
- 建伍对讲机TH-K2-K4AT中文使用说明书
评论
0/150
提交评论