2016-07-07 95 views
0

在我的程序中,我打開一個文件並在其中寫入「Hello world」。我正在使用snprintf()來填充'fname'變量。在此之後,我把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

您明確告訴'snprintf'可以在'fname'中產生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

由於你的問題是關於你看到很多額外的字符,你沒有分配,它始終是最好的做法,初始化你定義的內存(簡單變量,數組或指針),以便你總是看到你的期望。

在你的情況,你可以這樣做:

char fname[100] = {0};

我從GDB得到的迴應是更加可預測這樣的:

(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

相關問題