下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言程序编译的内存分配:1. 栈区( stack ) - 编译器自动分配释放,主要存放函数的参数值,局部变量值 等;2. 堆区( heap) - 由程序员分配释放;3. 全局区或静态区 - 存放全局变量和静态变量;程序结束时由系统释放,分为全 局初始化区和全局未初始化区;4. 字符常量区 - 常量字符串放与此,程序结束时由系统释放;5. 程序代码区 - 存放函数体的二进制代码 例: /main.cint a=0; / 全局初始化区char *p1; / 全局未初始化区void main()int b; / 栈char s="bb" / 栈char *p2; / 栈char
2、 *p3="123" / 其中,“ 123 0”常量区, p3 在栈区static int c=0; / 全局区p1=(char*)malloc(10); /10 个字节区域在堆区strcpy(p1,"123"); /"1230" 在常量区,编译器 可能 会优化为和 p3 的指向同一 块区域 一个C程序占用的内存可分为以下几类:( 一) 栈这是由编译器自动分配和释放的区域。主要存储函数的参数,函数的局部变量 等。当一个函数开始执行时,该函数所需的实参,局部变量就推入栈中,该函数执 行完毕后,之前进入栈中的参数和变量等也都出栈被释放掉。
3、它的运行方式类似于 数据结构中的栈。( 二) 堆这是由程序员控制分配和释放的区域,在C里,用malloc()函数分配的空间就存在于堆上。在堆上分配的空间不像栈一样在某个函数执行完毕就自动释放,而 是一直存在于整个程序的运行期间。当然,如果你不手动释放 (free() 函数) 这些空 间,在程序运行结束后系统也会将之自动释放。对于小程序来说可能感觉不到影响 的存在,但对于大程序,例如一个大型游戏,就会遇到内存不够用的问题了 ( 三 ) 全局区C 里的全局变量和静态变量存储在全局区。它们有点像堆上的空间,也是持续 存在于程序的整个运行期间,但不同的是,他们是由编译器自己控制分配和释放 的。( 四
4、) 文字常量区例如 char *c =“123456”;则” 123456”为文字常量,存放于文字常量区。也由编译器控制分配和释放。( 五 ) 程序代码区 存放函数体的二进制代码 2 例子( 一) int b; / 栈 char s = "abc" /s char *p1,*p2; / 栈 char *p3 = "123456" /"123456" static int c =0; /全局区p1 = (char *)malloc(10); /p1 p2 = (char *)malloc(20); /p2 strcpy(p1, &quo
5、t;123456"); /"123456"在栈 ,"abc" 在文字常量区int a = 0; / 全局区 void main()在常量区, p3 在栈上在栈,分配的 10 字节在堆在栈,分配的 20 字节在堆放在常量区/ 编译器可能将它与 p3 所指向的 "123456" 优化成一个地方。 3 例子( 二)/ 返回 char 型指针char *f()/s 数组存放于栈上char s4 = '1','2','3','0'return s; / 返回 s 数组的地
6、址,但程序运行完 s 数组就被释放了void main() char *s;s = f();printf ("%s", s); /打印出来乱码。因为 s 所指向地址已经没有数据还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。栈的空间大小有限定,VC的缺省是2M栈不够用的情况一般是程序中分配了大量 数组和递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该 函数中所有的栈空间。栈是由编译器自动管理的,不用你操心。堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内 存泄漏。并且频繁地 malloC 和 free 会产生内存碎片(有点
7、类似磁盘碎片),因为 C分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片,在栈上存取数据 比通过指针在堆上存取数据快些。一般大家说的堆栈和栈是一样的,就是栈 (stack),而说堆时才是堆heap.栈是先入后出的,一般是由高地址向低地址生 长。堆(heap)和栈(stack)是C/C 编程不可避免会碰到的两个基本概念。首先, 这两个概念都可以在讲数据结构的书中找到,他们都是基本的数据结构,虽然栈更 为简单一些。在具体的 C/C 编程框架中,这两个概念并不是并行的。对底层机器 代码的研究可以揭示,栈是机器系统提供的数据结构,而堆则是 C/C 函数库提供 的。具体地说,现代计算机 (串行执行
8、机制 ) ,都直接在代码底层支持栈的数据结 构。这体现在,有专门的寄存器指向栈所在的地址,有专门的机器指令完成数据入 栈出栈的操作。种机制的特点是效率高,支持的数据有限,一般是整数,指针,浮 点数等系统直接支持的数据类型,并不直接支持其他的数据结构。因为栈的这种特 点,对栈的使用在程序中是非常频繁的。对子程序的调用就是直接利用栈完成的。 机器的 call 指令里隐含了把返回地址推入栈,然后跳转至子程序地址的操作,而 子程序中的 ret 指令则隐含从堆栈中弹出返回地址并跳转之的操作。 C/C 中的自 动变量是直接利栈的例子,这也就是为什么当函数返回时,该函数的自动变量自动 失效的原因。和栈不同,
9、堆的数据结构并不是由系统 (无论是机器系统还是操作系统 )支持 的,而是由函数库提供的。基本的 malloc/realloc/free 函数维护了一套内部的堆 数据结构。当程序使用这些函数去获得新的内存空间时,这套函数首先试图从内部 堆中寻找可用的内存空间,如果没有可以使用的内存空间,则试图利用系统调用来 动态增加程序数据段的内存大小,新分配得到的空间首先被组织进内部堆中去,然 后再以适当的形式返回给调用者。当程序释放分配的内存空间时,这片内存空间被 返回内部堆结构中,可能会被适当的处理 (比如和其他空闲空间合并成更大的空闲 空间),以更适合下一次内存分配申请。这套复杂的分配机制实际上相当于一
10、个内 存分配的缓冲池(Cache),使用这套机制有如下若干原因:1. 系统调用可能不支持任意大小的内存分配。有些系统的系统调用只支持固定大 小及其倍数的内存请求 (按页分配);这样的话对于大量的小内存分类来说会造成浪 费。2. 系统调用申请内存可能是代价昂贵的。系统调用可能涉及用户态和核心态的转 换。3. 没有管理的内存分配在大量复杂内存的分配释放操作下很容易造成内存碎片 堆和栈的对比从以上知识可知,栈是系统提供的功能,特点是快速高效,缺点是有限制,数 据不灵活;而堆是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效 率有一定降低。栈是系统数据结构,对于进程 /线程是唯一的;堆是函数库内部数 据结构,不一定唯一。不同堆分配的内存无法互相操作。栈空间分静态分配和动态 分配两种。静态分配是编译
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 卷烟服务营销课题研究报告
- 2025年互联网+金融行业区块链技术在支付领域的可行性研究报告
- 涉外仲裁协议的效力问题研究报告
- 垃圾分类研究报告应该怎么写范文简单
- 国内城乡居民养老保险制度现状研究报告
- 福建漳州市龙文区碧湖兴龙投资有限公司招聘笔试题库2026
- 2027届山西农业大附属中学数学八上期末监测试题含解析
- 浙江省台州市海山教育联盟2027届七上数学期末调研模拟试题含解析
- 河北省保定高阳县联考2027届九年级数学第一学期期末检测模拟试题含解析
- 2026年山东省诸城市高三数学下册期末考试模拟测试卷A4版附答案
- 旅游景区管理培训课件
- 【英语】高一英语完形填空夹叙夹议解题技巧及经典题型及练习题(含答案)
- 汤姆叔叔的小屋课件
- 北京市二中教育集团2025-2026学年七年级上学期月考语文试题(含答案)
- 气管切开吸痰护理宣教
- 2025国庆节中秋节双节特色实践作业(三)
- 2025年江苏省职业技能等级认定考试(政务服务办事员·四级)历年参考题库含答案详解(5卷)
- 养老服务行业面试常见问题与答案解析
- 餐饮店免责合同协议书
- 安徽财经大学计算机基础专升本(共六卷)含答案解析
- 肺纤维化患者的护理查房
评论
0/150
提交评论