【问题标题】:GDB debugger : char array type examine and print commandGDB 调试器:char 数组类型检查和打印命令
【发布时间】:2016-11-15 13:37:46
【问题描述】:

在 C 程序中,我声明了一个字符缓冲区:char buffer_in[500]; 当我在 GDB 上逐步运行该程序时,我使用以下命令测试缓冲区引用:

(gdb) ptype buffer_in
type = char [500]
(gdb) ptype &buffer_in
type = char (*)[500]
(gdb) p &buffer_in
$9 = (char (*)[500]) 0x7fffffffdb60
(gdb) x buffer_in
0x7fffffffdb60: 0x2e
(gdb) x &buffer_in
0x7fffffffdb60: 0x2e

在 C 中,如果我声明了字符数组,则对象像指针一样被引用。我 &buffer_in 它是数组的第一个元素的地址,为什么命令 x buffer_in 的输出与 x &buffer_in 相同?我认为x buffer_in 必须尝试检查 0x2e 地址,因此引用错误。

谢谢

【问题讨论】:

标签: c arrays gdb character


【解决方案1】:

因此,gdb 的 x 命令需要一个内存地址 - 该命令的目的是以十六进制转储一些内存。如果你给它一个数组变量,它会假设你的意思是你希望它从存储数组的地址开始转储。如果你给它一个指向数组变量的指针,它会假设你的意思是你希望它从那个指针开始转储。这两者是相同的——这很像 C 的实际编译方式。

为了更好地说明这一点,

 printf("0x%8.8lX 0x%8.8lX\n", (unsigned long)buffer_in, (unsigned long)&buffer_in);

两次打印相同的数字。因此,当要求 gdb 转储每个地址表达式时,您会期望 gdb 从内存中转储相同的字节。

【讨论】:

  • 谢谢,&buffer_in 就像&buffer[0]
猜你喜欢
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多