You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:15:08