C程序的内存布局
C程序的内存布局如下所示。它包含几个层级,分别是:
- 栈段
- 堆段
- 代码段
- 数据段
现在让我们看看这些段的功能。
序号 | 段 & 描述 |
---|---|
1 | 栈 进程栈包含临时数据,例如方法/函数参数、返回地址和局部变量。它是为自动变量和函数参数分配的内存区域。它还在执行函数调用时存储返回地址。栈使用 LIFO(后进先出)机制来存储局部变量或自动变量、函数参数以及存储下一个地址或返回地址。返回地址指的是函数执行完成后返回的地址。此段的大小根据局部变量、函数参数和函数调用而变化。此段从高地址向低地址增长。 |
2 | 堆 这是在进程运行时动态分配给进程的内存。它是为动态内存存储分配的内存区域,例如 malloc() 和 calloc() 调用。此段的大小也根据用户分配而变化。此段从低地址向高地址增长。 现在让我们检查一下段(数据和 bss 段)的大小在一些示例程序中是如何变化的。可以使用“size”命令获取段的大小。 |
3 | 代码段 这包括由程序计数器的值表示的当前活动以及处理器的寄存器内容。它由 .text 部分表示。它定义了一个存储指令代码的内存区域。这也是一个固定区域。 |
4 | 数据段 此段包含全局变量和静态变量。它由 .data 段和 .bss 表示。.data 段用于声明内存区域,程序的数据元素存储在此区域中。此段在声明数据元素后无法扩展,并且在整个程序中保持静态。 .bss 段也是一个静态内存段,包含稍后在程序中声明的数据的缓冲区。此缓冲区内存被清零。 |
数据段可以进一步细分为两个部分。
序号 | 段 & 描述 |
---|---|
1 | 已初始化数据段 这是目标文件或程序虚拟地址空间的一部分,包含未初始化的静态和全局变量。未初始化数据段也称为 BSS(以符号开头块)段。 |
2 | 未初始化数据段 这是可读写的,因为变量的值可以在运行时更改。此段也具有固定大小。 |
广告