C语言内存分区理解

一、

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

二、


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

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

463e012d196a470989dcf92042fd6be5.png

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

 

三、

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

 

扩展

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值