C程序的内存布局


C程序的内存布局如下所示。它包含几个层级,分别是:

  • 栈段
  • 堆段
  • 代码段
  • 数据段

现在让我们看看这些段的功能。

序号段 & 描述
1
进程栈包含临时数据,例如方法/函数参数、返回地址和局部变量。它是为自动变量和函数参数分配的内存区域。它还在执行函数调用时存储返回地址。栈使用 LIFO(后进先出)机制来存储局部变量或自动变量、函数参数以及存储下一个地址或返回地址。返回地址指的是函数执行完成后返回的地址。此段的大小根据局部变量、函数参数和函数调用而变化。此段从高地址向低地址增长。
2
这是在进程运行时动态分配给进程的内存。它是为动态内存存储分配的内存区域,例如 malloc() 和 calloc() 调用。此段的大小也根据用户分配而变化。此段从低地址向高地址增长。
现在让我们检查一下段(数据和 bss 段)的大小在一些示例程序中是如何变化的。可以使用“size”命令获取段的大小。
3代码段
这包括由程序计数器的值表示的当前活动以及处理器的寄存器内容。它由 .text 部分表示。它定义了一个存储指令代码的内存区域。这也是一个固定区域。
4数据段
此段包含全局变量和静态变量。它由 .data 段和 .bss 表示。.data 段用于声明内存区域,程序的数据元素存储在此区域中。此段在声明数据元素后无法扩展,并且在整个程序中保持静态。
.bss 段也是一个静态内存段,包含稍后在程序中声明的数据的缓冲区。此缓冲区内存被清零。

数据段可以进一步细分为两个部分。

序号段 & 描述
1已初始化数据段
这是目标文件或程序虚拟地址空间的一部分,包含未初始化的静态和全局变量。未初始化数据段也称为 BSS(以符号开头块)段。
2未初始化数据段
这是可读写的,因为变量的值可以在运行时更改。此段也具有固定大小。

更新于: 2019年7月30日

2K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告