为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

C程序的内存分配

2011-05-18 12页 ppt 262KB 36阅读

用户头像

is_949959

暂无简介

举报
C程序的内存分配nullC\C++程序的内存分配C\C++程序的内存分配堆和栈的区别一、基本概念一、基本概念1.栈区(stack) 由编译器自动分配、释放 存放函数的参数值、局部变量的值等 类似于数据结构中的栈 2.堆区(heap) 一般由程序员分配、释放, 若程序员不释放,程序结束时可能由OS回收。 与数据结构中的堆不同,分配方式类似于链表null3、初始化数据区/静态数据区(static) 全局变量、静态变量、常量数据的存储 程序结束后由系统释放 4、未初...
C程序的内存分配
nullC\C++程序的内存分配C\C++程序的内存分配堆和栈的区别一、基本概念一、基本概念1.栈区(stack) 由编译器自动分配、释放 存放函数的参数值、局部变量的值等 类似于数据结构中的栈 2.堆区(heap) 一般由程序员分配、释放, 若程序员不释放,程序结束时可能由OS回收。 与数据结构中的堆不同,分配方式类似于链表null3、初始化数据区/静态数据区(static) 全局变量、静态变量、常量数据的存储 程序结束后由系统释放 4、未初始化区 常量字符串 程序结束后由系统释放 5、代码区 存放CPU执行的机器指令 可共享、只读的null二、例子程序二、例子程序//main.cpp int a = 0; (全局初始化区) char *p1;(全局未初始化区) main() { int b; 栈 char s[] = "abc"; 栈 char *p2; 栈 nullchar *p3 = "123456"; 123456\0在常量区,p3在栈上。 static int c =0; 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 分配得来的10和20字节的区域就在堆区 注意 p1, p2本身是在栈中的 nullstrcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的“123456” 优化成一个地方。 free(p1); free(p2); 释放堆空间 }三、堆和栈的理论知识三、堆和栈的理论知识3.1、申请方式 栈区(stack) 由系统自动分配 堆区(heap) 需要程序员自己申请,并指明大小。 在C中malloc函数,在C++中用new运算符 null3.2、申请后系统的响应 栈区(stack):只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 堆区(heap): 记录空闲内存地址的链表 遍历该链表 大于所申请空间的堆结点 该结点的空间分配给程序 null3.3 申请大小的限制 栈区(stack) 栈是向低地址扩展的数据结构,是一块连续的内存区域 栈顶的地址和栈的最大容量是系统预先规定 申请的空间超过栈的剩余空间,溢出 堆区(heap) 堆是向高地址扩展的数据结构,是不连续的内存区域 受限于计算机系统中有效的虚拟内存null 3.4堆和栈中的存储方式 (1).栈区(stack) 进栈:主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址参数(由右往左入栈的)函数中的局部变量(注意静态变量是不入栈的) 出栈 :局部变量参数主函数中的下一条指令 (2).堆区(heap) 在堆的头部用一个字节存放堆的大小 由程序员安排四、小结:栈和堆的区别四、小结:栈和堆的区别(1)管理方式不同 (2)空间大小不同 (3)是否产生碎片 (4)增长方向不同 (5)分配方式不同 (6)分配效率不同
/
本文档为【C程序的内存分配】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索