C语言内存模型
C语言程序的内存模型分为下面五个,分别为:
- text segment
- data segment
- bss
- stack
- heap
text segment(代码段)
text segment
简称为文本段,又叫代码段(code segment
),存放指令的地方,这一部分内存区域是可读(read - only)的
,因为一个程序在被写好之后,其执行逻辑也是相同的。所以一般程序被加载到内存中来,其代码段有且仅被加载一次。无法改变
data segment(数据段)
data segment
又称为数据段,用于存放初始化了的全局变量和静态变量
。又可细分为read only data segment
和 read - write data segment
,前者是用于存放常量的地方,后者是用于存放变量的地方
bss(未初始化数据段)
bss
存放未初始化的全局变量和静态变量
,一般未初始化的静态变量会被机器自动初始化为一个特定值,比如说0,它的值是可以在运行时被改变的
stack(堆栈空间)
堆栈空间与堆空间与动态分配的空间有关,在X86架构上,堆栈起始位置位于bss段下面,而堆指针位于最下方,两者相对者运行,并且以堆栈指针大于堆指针作为overflow
的标志,堆栈有先进先出的特征,用于存放在函数调用时保存进程的上下文,并且有一种叫stack frame(栈帧)
的名词,用于存放传入的参数和返回地址,一个栈帧至少包含一个返回地址
,因为栈帧的存在和上下文的保护,使得函数调用中其内部的操作不会影响到其它的数据,并且一些局部变量也会是存放在堆栈里面
heap(堆空间)
堆空间与内存分配有关,与calloc, readloc,free
等有关,用于申请动态变量,一些共享库也会使用到这部分的空间
Case
int global_var1 = 10; // Data Segment
int global_var2; // Bss
int main(){
static int var1 = 20; // Data Segment
static int var2; // Bss
return 0;
}