C语言内存分区理解

一、

内存分区:从0xffffffff到0x00000000的顺序,都为虚拟内存,不是真实的,即同一个编译器编译出来的可执行二进制代码,多次运行后同一个变量的地址都会是一样的,都默认有最大内存如4Gb,但运行需要多少就分配多少        最高地址linux中1G,win中2G为内核空间,多进程共用
        ①栈区:局部变量、局部常量
        ②堆区(申请后都要释放)、
        ③未初始化全局、静态变量区(.bss区):未初始化的全局变量和未初始化的静态变量(全局、局部),程序运行时清0,或者初始化为0的全局变量和初始化为0的全局静态变量
        ④已初始化全局、静态变量区(.data区):已初始化的全局变量、已初始化的全局和局部静态变量
        ⑤代码区(.text区):存放常量(除局部常变量外),代码(函数指针指向此处)

二、


1、内存从低地址到高地址为:代码区、常量(除局部常变量外)——.data区——.bss区——堆区——栈区(栈区内存从高地址开始分配,其他相反)

注:据我实测,以上为linux下常量位置,而windows下常量在.data区(此见下图)。或者应该跟编译器等等有关,此处我未再纠结。
2、程序运行时,给未初始化的全局变量 / 未初始化的静态全局变量赋值后,该变量仍在.bss段

C语言内存分区理解_第1张图片

 显然可得出,上图中地址0x403xxx为.data区,0x407xxx为.bss段,而.data区再往下低地址为代码区.text,非空函数指针指向在此区

 

三、

1、动态储存:程序在运行时才分配栈区空间。        局部变量、局部常变量
2、静态储存:程序运行前提前分配好内存。            全局静态变量、局部静态变量、全局变量、全局常变量、全局局部右值常量(指针类型字符串)

 

扩展

.bss段实际上未占据任何磁盘存储空间,也就是徒有其名,无有其实,只是在ELF的section header table 中记录其应该分配到的磁盘存储空间,而直到可执行程序被加载到内存中时,加载器将依据.bss段的section header中的信息,在内存中为其分配空间。

 

你可能感兴趣的:(c语言)