进程内存结构
所有的进程都运行在自己的虚拟地址空间中,而每个进程都有自己的内存地址。
每个进程都运行在自己私有的内存空间中(虚拟地址空间)。在32位系统中,4GB的进程地址空间被分成用户空间(0~3GB)和内核空间(3GB~4GB)两部分。
代码段保存可执行文件的操作指令和程序定义的常量全局只读变量(const),字符串常量 多进程能够共享相同的代码段,即当程序被多次执行时,运行的相同程序将共享代码段.
只读数据段
也有将常量、字面值和const声明的变量所存储的位置成为只读数据段,但是要注意**只读数据段** 与生命周期无关
数据段
在代码段的下方,分成初始化数据段和未初始化数据段(BSS段)。
栈内存
保存程序中创建的临时变量。函数调用时,传递的参数也被保存在栈中。在函数调用结束后,其返回值也保存在栈中。栈有先进先出的特点,适合于保护和恢复现场。可以把栈看作是临时存放数据、进行数据交换的内存区域。
从变量来看,局部变量(初始化的和未初始化的,但不包含静态变量)局部只读变量(const)
下面这张图来自《程序员的自我修养》
补充:从编译的角度
static变量无论是全局的还是局部的,都存在初始化数据段,为全局/静态区域,在编译期就为其分配内存。
全局变量同样,但是分是否初始化。
const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放,例如:val_c;
const局部变量存储在栈中,代码块结束时释放,例如:val_j。
**const关键字并不能把变量变成常量(C专家编程21页)**const限定符只是说明这个符号不能被修改