31. 程序的内存布局

程序文件的一般布局

代码在可执行程序中的对应关系

文件布局在内存中映射

各个段的作用

堆栈段程序运行后正式存在,是程序运行的 基础
text段存放的是程序中的 可执行代码
bss段存放的是 未初始化的 全局变量和静态变量
data段保存的是那些 已经初始化了的 全局变量和静态变量
rodata段 存放程序中的常量值, 如 字符串常量
int *p = "hello world!";//rodata段,只读数据段
p[0] = 'H';//段错误

程序术语对应关系

静态存储区通常指程序中的 .bss和.data段
只读区通常指程序中的 .rodata段
局部变量所占空间为 上空间
动态空间中的空间----空闲列表管理法
程序 可执行代码存放于 .text段

问题:

函数的地址对应程序的哪个段?

在大多数程序执行环境中,函数的地址通常对应程序的 .text段(也称为代码段或文本段)。.text段包含了程序的可执行代码,包括函数体中的机器指令。这些指令是CPU在运行时执行的对象。
当程序被加载到内存中时,.text段的内容通常会被标记为只读,以防止程序意外地修改其指令。这是因为如果指令被修改,程序的行为可能会变得不可预测,导致错误或安全漏洞。

同是全部变量和静态变量 ,为什么初始化的和未初始化的保存在不同段中?

  1. 初始化的变量 :这些变量在程序编译时就已经被赋予了特定的值。为了提高程序的启动效率,编译器会将这些已初始化的变量放在同一个段中,通常是  .data  段。这样,在程序启动时,启动代码可以简单地复制或初始化这些变量的值,而无需进行额外的计算或操作。
  2. 未初始化的变量 :未初始化的变量在程序编译时没有具体的值。为了节省空间和提高效率,这些变量通常会被放在  .bss  段中。在程序启动时,启动代码可以简单地调用  memset  或其他类似函数,将这些变量的内存区域全部设置为0或某个默认值,而无需为每个变量单独赋值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值