各部分说明如下:
(1)代码区(text segment):又称只读区。通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,比如字符串常量等。
(2)全局初始化数据区/静态数据区(Data Segment):用来存放程序已经初始化的全局变量,已经初始化的静态变量。位置位于可执行代码段后面,可以是不相连的。在程序运行之初就为数据段申请了空间,程序退出的时候释放空间,其生命周期是整个程序的运行时期。
(3)未初始化数据区(BSS):用来存放程序中未初始化的全局变量和静态变量,位置在数据段之后,可以不相连。其生命周期和数据段一样。(2)和(3)统称为静态存储区。
(4)栈区(Stack):又称堆栈,存放程序临时创建的局部变量,如函数的参数值、返回值、局部变量等。也就是我们函数括弧{}中定义的变量(但不包括static声明的静态变量,static意味着在数据段中存放的变量)。除此之外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且等到调用结束后,函数的返回值也会被存放回栈中。编译器自动分配释放,是向下有限扩展的。
(5)堆区(Heap):位于栈区的下面,是向上有限扩展的。用于存放进程运行中动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存的时候,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存的时候,被释放的内存从堆中被剔除(堆被缩减)。一般由程序员进行分配和释放,若不释放,在程序结束的时候,由OS负责回收。
const修饰的全局变量保存在代码区中,const修饰的局部变量保存在栈段中。