Text:代码段。存放程序的全部代码(指令),来源于二进制可执行文件中的代码部分,在编译的时候就已经放置到二进制文件中。
Initialized data(简称data段)和uninitialized data(简称bss段)组成了数据段。其中data段存放的是已初始化全局变量和已初始化static局部变量,来源于二进制可执行文件中的数据部分,这部分在编译的时候就已经放置到二进制文件中;bss段存放的是未初始化全局变量和未初始化static局部变量,其内容不来源于二进制可执行文件中的数据部分(也就是说:二进制可执行文件中的数据部分没有未初始化全局变量和未初始化static局部变量)。根据C语言标准规定,它们的初始值必须为0,因此bss段存放的全是0.将bss段清0的工作是由系统在加载二进制文件后,开始执行程序前完成的,系统执行这个清0操作是有内核的一段代码完成的(exec系统调用)。至于exec从内存什么地方开始清0-以及要清0多少空间,则是由记录在二进制可执行文件中的信息决定的(即二进制文件中记录了text、data、bss段的大小)
Malloc是从heap中分配空间的。
Stack(栈)存放的是动态局部变量。即当调用子函数时,系统会从栈中分配空间给该子函数的动态局部变量(注意:此时栈向内存低地址延伸);当子函数返回时,系统的栈会向内存高地址延伸,这相当于释放子函数的动态局部变量的内存空间。假设main函数在调用子函数A后立即调用子函数B,那么子函数B的动态局部变量就会覆盖原来子函数A的动态局部变量的存储空间,这就是子函数不能互相访问对方动态局部变量的根本物理原因。
内存的最高端存放的是命令行参数和环境变量,将命令行参数和环境变量放到指定位置这个操作是有OS的一段代码(exec系统调用)在加载二进制文件到内存后,开始运行程序前完成的。
摘自《Linux下C语言应用编程》