2016-07-07 10 views
0

In meinem Programm öffne ich eine Datei und schreibe "Hallo Welt" darin. Ich verwende snprintf(), um 'fname' Variable zu füllen. Danach setze ich gdb auf a.out und drucke die Zeichenkette 'fname'. Ich sehe, dass es in der Zeichenfolge 'fname', die ich nicht zugewiesen habe, eine Menge extra Zeichen gibt. Woher kommen diese zusätzlichen Charaktere? Könnte jemand bitte helfen?Warum schreibt snprintf() zusätzliche Zeichen?

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 Ausgang:

(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 

Danke.

+7

Debugger zeigt Ihnen alle '100' Zeichen, die für' fname' Array zugewiesen sind - unabhängig davon, ob Sie ihnen etwas zugewiesen haben oder nicht – mvidelgauz

+0

Sie haben 'snprintf' ausdrücklich angewiesen, 100 Zeichen in' fname' zu ​​erzeugen. Es hat genau das getan. – Koshinae

+2

@Koshinae Nein. Das Größenargument in 'snprintf' bedeutet, dass es" höchstens ** schreibt ** Größe Bytes " – cnicutar

Antwort

7

In diesem Fall kümmert sich Gdb nicht um Ihren 0-Terminator in der Zeichenfolge und druckt nur das Array, d. H. Die vollen 100 Zeichen in fname.

Sie können auch printf "%s" oder p /s verwenden, wenn gdb Ihr Array als C-String behandeln soll.

+0

Oder 'p (char *) fname ', die gut darauf aufmerksam macht, dass sich der Grund' p' anders verhält als jede Funktion, die Sie in C aufrufen können, dass er im Gegensatz zu einer C-Funktion einen Array-Parameter als Array sehen kann (der übliche "Zerfall" zum Zeiger passiert nicht –

+0

@ WumpusQ.Wumbley Dies ist ein subtiler und wichtiger Punkt. Mit anderen Worten, da 'p (char *) fname 'keine Größeninformation mehr hat, muss es sich auf einen 0-Terminator verlassen. Bitte zögern Sie nicht, die Antwort zu bearbeiten, um dies hinzuzufügen! – cnicutar

+0

Danke euch allen. – NeilB

0

Da Ihre Frage darin besteht, viele zusätzliche Zeichen zu sehen, die Sie nicht zugewiesen haben, ist es immer die beste Methode, den von Ihnen definierten Speicher (einfache Variablen, Arrays oder Zeiger) zu initialisieren, damit Sie immer sehen, was Sie erwarten.

In Ihrem Fall könnten Sie tun:

char fname[100] = {0};

Die Antwort, die ich von GDB erhalten somit berechenbarer ist:

(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) 

Jetzt sollten Sie sehen, was Sie erwarten. Ich hoffe es hilft.

+0

Danke. Das funktioniert für mich. – NeilB

Verwandte Themen