C语言内存分区、堆栈的不同

C/C++内存分区

首先要清楚一点,程序未运行和运行时是有一点区别的

程序运行时主要分区

1.栈区
2.堆区
3.全局/静态区
4.常量区
5.代码区

栈区

  • 由编译器自动分配释放,用于存放函数形参、返回地址、返回数据、局部变量数据
  • 由高地址向低地址扩展的一块连续的内存区,向下生长的,也就是向着内存地址减小的方向
  • 效率高,但分配内存有限,程序员无法控制

堆区

  • 程序员分配释放的空间,程序结束时可能由系统回收
  • 由低地址向高地址扩展的一块不连续的内存区域,向上生长的,也就是向着内存地址增加的方向
  • 存储方式类似于链表,遍历空闲地址的链表,寻找第一个空间大于申请大小的空间
  • 动态内存开辟,效率较慢,容易产生内存碎片

堆栈的不同

栈区堆区
分配方式不同系统分配程序员分配
空间大小不同空间较小空间较大
分配效率不同效率高效率低
产生内存碎片不同不产生碎片产生碎片
生长方向不同向下生长向上生长

全局/静态区

可为未初始化的全局/静态变量 和 已初始化的全局/静态变量
未初始化的全局/静态变量
  • 代码编译后,未初始化或值为0的全局变量、静态变量,只记录数据大小,不分配空间,只有当程序运行时,才分配对应的内存空间给该变量
已初始化的全局/静态变量
  • 已初始化全局变量、静态变量正常分配空间

代码常量区

  • 常量就是放在该区。 程序结束后由系统释放
  • 该区数据不可修改,因此内存报错时可能是修改了无法修改的内存值

代码区

  • 存放代码文本(二进制)的区域
总结为这一张图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值