【C/C++】内存四区,什么变量存储在什么区域

在执行一个C/C++语言程序时,此程序将拥有唯一的内存四区——栈区、堆区、全局区、代码区。每个程序都有唯一的四个内存区域,我们需要熟悉和了解各个区域的特性,例如存储什么类型的数据,有谁去申请开辟,又有谁去管理释放。

静态区、代码区、堆区、栈区 存储地址一次下降

静态区:全局变量和静态变量存储在静态区

堆区:malloc的变量放在堆区,堆区一般由程序员分配释放。若程序员不释放,程序结束时可能由OS回收。注意:它与数据结构中的堆是两回事,分配方式类似于链表。堆的增长方式由低地址向高地址。

栈区:局部变量放在栈区,存储非静态局部变量、函数参数、返回地址。由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似与数据结构中的栈。栈的分配时由高位地址向地位地址。且注意,函数参数的载入时由右到左。

栈和堆的生长方向

栈:从大到小(地址)

堆:从小到大(地址)

一个程序本质上都是由BSS段、data段、text段(代码段)。一个可执行程序在存储(没有调入内存)时分为代码段、数据段和未初始化数据区三个部分。

BSS段(未初始化数据区):通常用来存放未初始化的全局变量和静态变量的一块内存区域。BSS段属于静态分配,程序结束后静态变量资源由系统自动释放。

data数据段:数据段也属于静态内存分配。该区包含了在程序中明确被初始化的全局变量、已经被初始化的静态变量(全局、局部)和常量数据(字符串常量)。

text代码段:存放执行代码的一块内存区域。这部分区域的大小在程序运行之前就已经确定,并且内存区域属于只读。

text段和data段在编译时已经分配了空间,而BSS段并不占用可执行文件的大小,它是由连接起来获取内存。

BSS段的内容并不存放在磁盘上的程序文件中。因为内核在程序开始运行前将他们设置为0。需要存放在程序文件中的只有正文段和初始化数据段。

data段则为数据分配空间,数据保存到目标文件中。

数据段包含经过初始化的全局变量以及它们的值。BSS段大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据段的后面。当这个内存进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区。

可执行程序在运行时又多出了两个区域:栈区和堆区。

栈区:由编译器自动释放,存放函数的参数值、局部变量等。每当一个函数被调用时,该函数的返回类型和一些调用的信息被存放到栈中。然年后这个被调用的函数再为它的自动变量和临时变量在栈上分配空间。每调用一个函数,一个栈就会被使用。栈区是从高地址位向低地址位增长的,是一块连续的内存区域,最大容量是由系统预先定义好的,申请的栈空间超过这个界限时就会显示溢出,用户能从栈中获取的空间较小。

堆区:用于动态分配内存,位于BSS和栈中间的地址区域。由程序员申请分配和释放。堆是从低地址位向高地址位增长,采用链式存储结构。频繁地malloc/free会造成内存空间的不连续,产生碎片。当申请堆空间时库函数是按照一定的算法搜索可用的、足够大的空间。因此,堆的效率比栈的效率低得多。

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lindsey小姐月光加冕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值