linux系统(X86)存储内存布局

参数和环境区:程序执行的时候,命令行参数通过两个入口参数传递给main()函数,第一个参数 int argc表示

命令行参数的个数,第二个 char argv[] ,是一个指向命令行参数的指针数组,每个命令行参数都是以'\0'结尾

的字符串。

栈区:用来存放程序中的动态局部变量(不包括static修饰的局部变量,这类变量存储在数据段);函数参数

按照从右往左的顺序依次入栈,而函数调用结束后,函数的返回值也是存入栈中;因为栈具有先进先出的特点

,所以栈用来作为保存和/恢复调用现场

堆区:堆主要用来存放进程进行过程中动态分配的内存(malloc,calloc,realloc),它的大小并不是固定的;当

使用malloc等函数分配内存的时候,新分配的内存就被动态添加到堆中(堆被扩张);使用free函数释放内存就

是从堆中移除(堆被缩减);在堆中,有一块特殊的区域,叫做MMAP物理内存映射区,用于mmap函数。

bss区(未初始化数据区):bss段包含了程序中没有初始化的全局变量,静态变量(静态局部变量和静态全局变

量),在程序开始运行之前,内核将此段中的数据全部初始化成0或空指针

数据区这块区域用来存放可执行文件中不具有常属性且被初始化的静态变量和全局变量

代码区:这是CPU执行的机器指令的部分,正文段是用来存放可执行文件的操作指令,还有一些字面值常量和具有

常属性的静态变量和全局变量,它是可执行程序在内存中的映像。

 

存储区与存储数据类型的整理

存储区 数据类型
代码区 ①字面值常量②具有常属性且被初始化的静态所有变量和全局变量
数据区 不具有常属性且被初始化的静态所有变量和全局变量
bss区 所有(不管是否具有常属性)未初始化的静态所有变量和全局变量
栈区 动态局部变量(不管是否被初始化,具有常属性)