操作系统

C 程序的存储空间分布

Posted by Mcoder on December 26, 2019 页面浏览

C语言程序的存储空间布局

C程序一般有以下几个部分组成

  • 正文段
  • 初始化数据段
  • 未初始化数据段

  • 正文段:存储CPU执行的机器指令部分,正文段常常是只读的,防止其他程序意外修改指令;正文段可以共享,同一个程序运行多个时,系统内只有一个正文段的副本。
  • 初始化数据段:通常称为数据段,包含了明确需要赋初值的变量。这个分区一般存储所有赋初值了的全局变量和静态变量,程序结束时释放内存空间。
  • 未初始化数据段(BSS段):未初始化数据段也称为bss段(block started by symbol),在程序开始执行前,内核将此区域的数据初始化为0或者空指针。PS:这就是为啥全局变量一般被初始化为0,而局部变量不初始化就是未知值。
  • 栈:局部变量以及每次函数调用时所需要保存的信息。每次函数调用时,其返回地址及调用者的环境信息(寄存器的值)都存放在栈中。最近被调用的函数在栈上为其局部变量分配空间。递归函数每次调用功能自身时,就会用一个新的栈帧,因此一个函数调用实例的内部变量变化不影响到其他函数实例中的内部变量变化。
  • 堆: 通常在堆中进行动态内存分配。堆一般位于未初始化数据段和栈之间。

Reference

  1. APUE 3rd Sec 7.6