从内存低地址到内存高地址:
text:代码段/存放程序的全部代码(指令),来源于二进制可执行文件中的代码部分,在编译的时候就已经放置到二进制文件中。
initialized data: data段
uninitialized data:bss段
以上两者组成了数据段。其中data段存放的是已经初始化的全局变量和已经初始化的static局部变量,来源于二进制可执行文件中的数据部分,这部分在编译的时候就已经放置到二进制文件中;bss段存放的是未初始化全局变量和未初始化static局部变量,其内容不来源于二进制可执行文件中的数据部分(也就是说:二进制可执行文件中的数据部分没有未初始化全局变量和未初始化static局部变量)。根据c语言标准规定,它们的初始值必须为0,因此bss段存放的是全0.
heap:堆 负责分配malloc
stack:栈 存放的是动态局部变量。也就是函数内部定义的变量。需要注意的是栈顶是朝向内存低地址的,和heap堆正好相对。当子函数返回时,系统的栈会向内存高地址延伸,这相当于释放子函数的动态局部变量的内存空间。假设main函数在调用子函数a后立即调用子函数b,那么子函数b的动态局部变量就会覆盖原来子函数a的动态局部变量的存储空间。这就是子函数不能互相访问对方动态局部变量的根本物理原因。
内存的最高端存放的是命令行参数和环境变量。