C语言int类型数据内存存储规则与GDB调试异常问题咨询
现象原因
这个问题是x86架构默认采用小端字节序,叠加GDB默认按4字节长度读取内存的规则共同导致的:
- 小端字节序的核心规则是:多字节整数的低位字节存储在低内存地址,高位字节存储在高内存地址
- 你的int类型变量
a的值为4,4字节的完整十六进制表示为0x00000004,按照小端序存储在0x7fffffffde6c ~ 0x7fffffffde6f这4个连续地址的布局如下:- 最低地址
0x7fffffffde6c存最低位字节0x04 - 地址
0x7fffffffde6d存字节0x00 - 地址
0x7fffffffde6e存字节0x00 - 最高地址
0x7fffffffde6f存最高位字节0x00
- 最低地址
- 你在GDB中直接输入地址打印值时,GDB默认会从目标地址开始连续读取4个字节(DWORD长度),再按小端序解析为整数,就会得到你看到的结果:
- 读取
0x7fffffffde6b时,实际读取的是0x7fffffffde6b ~ 0x7fffffffde6e的4个字节,对应值为0x00 0x04 0x00 0x00,按小端序解析得到0x00000400 - 读取
0x7fffffffde6a时,实际读取的是0x7fffffffde6a ~ 0x7fffffffde6d的4个字节,对应值为0x00 0x00 0x04 0x00,按小端序解析得到0x00040000 - 读取
0x7fffffffde69时,实际读取的是0x7fffffffde69 ~ 0x7fffffffde6c的4个字节,对应值为0x00 0x00 0x00 0x04,按小端序解析得到0x04000000
- 读取
- 如果需要单独查看单个字节的内容,可以使用GDB命令
x /bx 目标地址,就能得到你预期的0x0结果。
内容的提问来源于stack exchange,提问作者Do Tran
相关产品推荐
相关产品推荐

