2016-11-15 1 views
1

Cプログラムでは、文字のバッファを宣言しました。char buffer_in[500]; Cにおいて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 

をIが宣言と文字の配列は、オブジェクトがポインタのように参照されている場合:私は、GDB上のステップによって、このプログラムステップを実行すると、このコマンドで iはバッファ参照をテストします。 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)を読むことをお勧めします。 -to配列/)、それは例えば'buffer_in'と'&buffer_in'です。 –

答えて

0

ので、GDBのxコマンドは、メモリアドレスを期待 - コマンドの目的は、六角で一部のメモリをダンプすることです。配列変数を与えると、配列が格納されているアドレスからダンプすることを意味するとみなされます。配列変数へのポインタを与えると、そのポインタからダンプすることを意味するとみなされます。それらの2つは同じです - これはCが実際にコンパイルされた方法に非常に似ています。 、

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

をその上に細かくポイントを置くことが

は二度同じ番号を印刷します。したがって、各アドレス式をダンプするように要求されたときにgdbがメモリから同じバイトをダンプすることを期待しています。

+0

ありがとう、 '&buffer_in'は'&buffer [0] 'に似ています。 – candido