2016-11-15 511 views
1

在C程序中,我声明了一个字符缓冲区:char buffer_in[500]; 当运行由GDB步骤此程序步骤i测试缓冲器参考与该命令:GDB调试器:char数组类型检查和打印命令

(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地址,所以它是错误的引用。

感谢

+0

我建议你尝试阅读[本博客文章](https://ghost.pileborg.se/2016/08/28/the-difference-between-arrays-decaying-to-pointers-and-pointers数组/),它试图区分例如'buffer_in'和'&buffer_in'。 –

回答

0

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

要穿上它更细一点,

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

打印相同数量的两倍。所以当你被要求转储每个地址表达式时,你会希望gdb从内存中转储相同的字节。

+0

谢谢,'&buffer_in'就像'&buffer [0]'。 – candido