2016-11-15 79 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