- Text Segment
Text Segment,通常也被称为代码段。
为了防止 heap 或是 stack 的溢出,text 段常被安排在 heap 或是 stack 之后。
Text 段通常是sharable 的, 所以对于使用频次比较高的程序,在内存中一般只有一份拷贝。另外,Text 段也常常只是 read-only 的,其目的是防止其中存放的指令被意外的修改。
- Initialized Data Segment
Initialized Data Segment 通常被称作数据段,这里存放着在源代码中已经被初始化的全局变量和静态变量。
需要注意的是,数据段并不一定是 read-only 的,因为这里存放的变量,它们的值在程序运行期间是可以修改的。
例如:
char s[] = “hello world”;
int debug = 1;
int main (void)
{
return 0;
}
其中的 s 和 debug 变量是存放在 read-write 数据区。
再看一个例子:
char * string = “hello world”
其中的 “hello world” 是存放于 read-only 数据区的,而指针变量 string 则是存放于 read-write 数据区。
- Uninitialized Data Segment
Uninitialized Data Segment,通常被称为 bss 段, 其名称来源于早期的表示 block started by symbol 的汇编操作符。在程序开始运行之前,由内核将存放于此数据段的数据初始化为0.
在程序中被初始化为 0 的、以及未给出明确初始值的全局变量和静态变量,被放置于此。
- Stack
Stack 被翻译为栈,其中的数据遵循后入先出(LIFO)原则。
局部变量,发生函数调用时 cpu 通用寄存器的值,被存储于栈中。
- Heap
Heap 的中文名称为堆,程序员动态 malloc/free 申请与释放的内存,即位于堆中。
下面通过 size(1) 命令对以上内容进行验证。
1.
2.
3.
4.
5.
6.
7.
参考文献:
http://www.geeksforgeeks.org/memory-layout-of-c-program/