C程序打印内存地址与GDB显示地址不匹配,0x7ffe前缀来源是什么
地址不匹配的核心原因
- 你使用了错误的printf格式化符输出地址:
%x的作用是打印32位无符号整数,而你当前运行程序的是64位系统,程序内的指针(内存地址)长度为64位。使用%x打印64位地址时,只会保留输出低32位的内容,高32位被直接截断丢弃。 - 你在C程序中看到的
0xefbffab0就是完整地址0x7ffeefbffab0的低32位部分,你所说的多出来的0x7ffe就是完整地址高32位的有效内容。 - 64位类Unix系统的用户态栈空间默认分配在
0x7fff开头的高地址区间,所以栈上存储的局部变量地址前缀都会是0x7ffe或0x7fff,属于系统地址空间布局的正常表现。
修复方案
如果需要在C程序中打印完整的64位地址,将格式化符替换为专门用于打印指针的%p即可,修改后的printf语句如下:
printf("A: %p B: %p\n", (void*)&buf, (void*)&cookie);
修改后输出的地址就会和GDB中查询到的地址完全一致。
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

