background image

堆内存只在程序运行时出现,一般由程序员分配和释放。在具有操作系统

的情况下,如果程序没有释放,操作系统可能在程序(例如一个进程)结束
后回收内存。

6.栈(stack

栈内存只在程序运行时出现,在函数内部使用的变量、函数的参数以及返

回值将使用栈空间,栈空间由编译器自动分配和释放。

C 语言目标文件的内存布局如图 13-1 所示。

代码段、只读数据段、读写数据段、未初始化数据段属于静态区域,而堆和

栈属于动态区域。代码段、只读数据段和读写数据段将在连接之后产生,未初
始化数据段将在程序初始化的时候开辟,而堆和栈将在程序的运行中分配和
释放。

C 语言程序分为映像和运行时两种状态。在编译-连接后形成的映像中,将

只包含代码段(Text)、只读数据段(RO Data)和读写数据段(RW 
Data)。在程序运行之前,将动态生成未初始化数据段(BSS),在程序的运
行时还将动态形成堆(Heap)区域和栈(Stack)区域。

一般来说,在静态的映像文件中,各个部分称之为节(Section),而在

运行时的各个部分称之为段(Segment)。如果不详细区分,可以统称为段。

知识点:C 语言在编译和连接后,将生成代码段(Text)、只读数据段

(RO Data)和读写数据段(RW Data)。在运行时,除了以上三个区域外,
还包括未初始化数据段(BSS)区域和堆(Heap)区域和栈(Stack)区域。

13.2  C 语言程序的段

13.2.1  段的分类

根据 C 语言的特点,每一个源程序生成的目标代码将包含源程序所需要表

达的所有信息和功能。目标代码中各段生成情况如下:

1.代码段(Code