background image

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

栈空间,栈空间由编译器自动分配和释放。

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

代码段由程序中的各个函数产生,函数的每一个语句将最终经过编译和汇编生成二

进制机器代码(具体生成哪种体系结构的机器代码由编译器决定)。

顺序代码

基本数学运算(+,-),逻辑运算(&&,||),位运算(&,|,^)等都属于顺序

代码。

选择代码