print &var 是查看变量地址最直接可靠的方式;gdb 不自动显示地址,p var 只输出值,而 p &var 才返回地址,适用于所有作用域变量,但优化下可能失效,此时需 info address(对全局/函数有效)或结合 x 命令验证。

print &var 是最直接、最可靠的方式。GDB 不会自动显示变量地址,必须显式取址;不加 & 用 p var 只会输出值,不是地址。
用 print &var 查看变量地址
这是标准做法,适用于所有作用域的变量(局部、全局、静态)。
- 在断点处执行
p &x,GDB 返回类似$1 = (int *) 0x7fffffffe27c的结果,其中十六进制部分就是地址 - 对数组名使用
p &arr得到的是整个数组起始地址(类型为int (*)[N]),而p arr默认退化为指针,类型是int *,值相同但语义不同 - 对指针变量
ptr,p &ptr是指针自身的地址,p ptr是它存储的值(即指向的目标地址),别混淆这两层 - 如果变量被编译器优化掉(比如用了
-O2),p &var可能报错No symbol "var" in current context—— 此时必须用-g -O0重新编译
用 info address var 查符号地址(不含调试信息时也有效)
当程序没带 -g 编译,或变量因优化不可见,info address 仍可能查到符号地址,因为它依赖链接后的符号表而非调试信息。
-
info address global_var能返回Symbol "global_var" is at 0x555555558014,哪怕该变量是static且未启用调试信息 - 对局部变量无效:函数栈帧内的变量没有全局符号表条目,
info address local_x会提示Symbol "local_x" not found - 对函数名有效:
info address main总能返回入口地址,可用于后续跳转或断点设置
结合 x 命令验证地址内容
拿到地址后,不能只信输出值;要用手动读内存的方式交叉验证,尤其怀疑变量被破坏或类型误判时。
- 假设
p &x返回0x7fffffffe27c,执行x/wx 0x7fffffffe27c应读出和p x一致的 4 字节整数值(w表示 word,x表示十六进制) - 若类型是
char,用x/cb &x看单字节;若是double,得用x/gx &x(g表示 8 字节) - 注意
x不检查类型安全,读越界或错单位(比如对int用h)会拼出错误数值,容易误导判断
真正容易被忽略的是:地址本身只是个数字,它的解释高度依赖上下文——同一地址,用 p、info address、x 查出的信息层级完全不同,混用却不加区分,是调试中定位偏差的常见源头。











