C/C++内存分区
首先要清楚一点,程序未运行和运行时是有一点区别的
程序运行时主要分区
1.栈区 2.堆区 3.全局/静态区 4.常量区 5.代码区
栈区
由编译器自动分配释放,用于存放函数形参、返回地址、返回数据、局部变量数据由高地址向低地址扩展的一块连续的内存区,向下生长的,也就是向着内存地址减小的方向效率高,但分配内存有限,程序员无法控制
堆区
程序员分配释放的空间,程序结束时可能由系统回收由低地址向高地址扩展的一块不连续的内存区域,向上生长的,也就是向着内存地址增加的方向存储方式类似于链表,遍历空闲地址的链表,寻找第一个空间大于申请大小的空间动态内存开辟,效率较慢,容易产生内存碎片
堆栈的不同
栈区堆区
分配方式不同系统分配程序员分配空间大小不同空间较小空间较大分配效率不同效率高效率低产生内存碎片不同不产生碎片产生碎片生长方向不同向下生长向上生长
全局/静态区
可为未初始化的全局/静态变量 和 已初始化的全局/静态变量
未初始化的全局/静态变量
代码编译后,未初始化或值为0的全局变量、静态变量,只记录数据大小,不分配空间,只有当程序运行时,才分配对应的内存空间给该变量
已初始化的全局/静态变量
已初始化全局变量、静态变量正常分配空间
代码常量区
常量就是放在该区。 程序结束后由系统释放该区数据不可修改,因此内存报错时可能是修改了无法修改的内存值
代码区
存放代码文本(二进制)的区域
总结为这一张图