2016-07-07 5 views
0

私のプログラムでは、ファイルを開いて "Hello world"と書いています。私は 'fname'変数を設定するためにsnprintf()を使用しています。この後、gdbをa.outに置き、文字列 'fname'を出力します。私は割り当てられていない文字列 'fname'に余分な文字がたくさんあることがわかります。これらの余分な文字はどこから来ていますか?誰でも助けてくれますか?なぜsnprintf()は余分な文字を書きますか?

3 int main(void) 
    4 { 
    5  FILE *debug_fp = NULL; 
    6  char fname[100]; 
    7 
    8  snprintf(fname, 100, "./my_debug_%d", getpid()); 
    9  debug_fp = fopen(fname, "w"); 
10  fprintf(debug_fp, "%s", "Hello world"); 
11  return 0; 
12 } 

gdbの出力:

(gdb) b test.c:10 
Breakpoint 1 at 0x4005be: file test.c, line 10. 

Breakpoint 1, main() at test.c:10 
10   fprintf(debug_fp, "%s", "Hello world"); 
(gdb) p fname 
$1 = "./my_debug_16178\000\000\000\000\000\000\000\000\300\313Ab:\000\000\000\360\[email protected]\000\000\000\000\000\063\[email protected]\000\000\000\000\000\001\000\000\000\000\000\301\000'\[email protected]", '\000' <repeats 13 times>"\300, \313Ab:\000\000\000\360\[email protected]", '\000' <repeats 13 times>"\260, \343\377\377" 
(gdb) q 

ありがとうございます。

+7

デバッガには、何かに割り当てられているかどうかにかかわらず、 'fname'配列に割り当てられた' 100'文字がすべて表示されます。 – mvidelgauz

+0

'fprint'に100個の文字を生成するよう明示しました。それはまさにそれでした。 – Koshinae

+2

@Koshinaeいいえ、「snprintf」のsize引数は、「最大でも**サイズのバイトを書く」ことを意味します。 – cnicutar

答えて

7

この場合、gdbは文字列の0ターミネータを気にせず、配列全体、つまりfnameの100文字を出力します。

gdbで配列をC文字列として扱う場合は、printf "%s"またはp /sを使用することもできます。

+0

'p(char *)fname'は、' p'がC言語で呼び出せる関数とは異なる動作をしていることに注意を喚起しています。これは、C関数とは異なり、配列パラメータを配列として見ることができますポインタへの通常の "減衰"は発生しません) –

+0

@ WumpusQ.Wumbleyこれは微妙で重要なポイントです。言い換えれば 'p(char *)fname'はサイズ情報を持っていないので、0ターミネータに依存しています。これを追加するには、解答を自由に編集してください! – cnicutar

+0

ありがとうございます。おかげさまで – NeilB

0

あなたが割り当てなかった余分な文字がたくさんあることについては、あなたがいつも期待通りに見えるように、定義したメモリ(単純変数、配列またはポインタ)を初期化することが常にベストプラクティスです。あなたのケースでは

、あなたができる:私はGDBから取得

char fname[100] = {0};

応答は、より予測可能である:

(gdb) b 9 
Breakpoint 1 at 0x400610: file st_fname.c, line 9. 
(gdb) run 
Starting program: /home/gops/data/samples/st_fname.o 

Breakpoint 1, main() at st_fname.c:9 
9   fprintf(debug_fp, "%s", "Hello world"); 
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.166.el6_7.7.x86_64 
(gdb) p fname 
$1 = "./my_debug_26808", '\000' <repeats 83 times> 
(gdb) 

今、あなたはあなたが期待するものを見る必要があります。それが役に立てば幸い。

+0

これは私のために働いています。 – NeilB

関連する問題