GDB调试器:char数组类型检查和打印命令

时间:2016-11-15 13:37:46

标签: c arrays gdb character

在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中,如果我声明了字符数组,那么对象就像指针一样被引用。 I& buffer_in它是数组的第一个元素的地址,为什么命令x buffer_in的输出与x &buffer_in相同?我认为x buffer_in必须检查0x2e地址,因此引用错误。

由于

1 个答案:

答案 0 :(得分:0)

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

要在它上面写一个更好的点,

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

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