Ich wollte Elemente von einer Zeichenfolge in eine andere Zeichenfolge übertragen und schrieb daher das folgende Programm. Anfangs dachte ich, dass die for-Schleife ausgeführt werden soll, bis das NULL-Zeichen (einschließlich d. H.) Kopiert wurde. Aber in diesem Code endet die for-Schleife, wenn ein NULL-Zeichen gefunden wurde (d. H. Noch nicht kopiert wurde), aber es kann immer noch die Zeichenkette anzeigen, in die die Elemente kopiert wurden. Wie ist das möglich, wenn es überhaupt kein NULL-Zeichen gibt?
%Vor% Die Funktion void puts(const char *)
basiert auf size_t strlen(const char *)
und die Ausgabe dieser Funktion ist undefined , wenn kein Null-Terminator vorhanden ist im übergebenen Argument (siehe diese Antwort ). In Ihrem Fall hat% code% in% strlen
wahrscheinlich einen Wert von 0 neben Ihrem Array im Speicher gefunden, was zu einem korrekten Verhalten von puts
führt. Dies muss jedoch nicht immer der Fall sein, da es nicht definiert ist.
Hier ist die Eingabe und Ausgabe auf meinem Computer:
%Vor%Siehe den Müll "絯 忐 '"? Dies ist ein nicht definiertes Verhalten. Ihr Programm funktioniert gut, weil Sie (un) glücklich sind.
Noch einmal, undefinierte Verhaltensweisen verdienen keine viel Diskussion.
Wenn Sie char temp[100]
deklarieren, ohne es zu initialisieren, benötigen Sie nur nicht initialisierten Speicher. Diese Erinnerung kann alles sein. Zum Beispiel schreibt das folgende Programm den ursprünglichen Inhalt von diesem als Ganzzahlen aus:
Dies druckt für mich durchweg eine andere Ausgabe aus, obwohl es bei einigen Zufallsfehlern weiterhin Abschnitte von Nullen druckt. z.B.:
88 -70 43 81 -1 127 0 0 88 -70 43 81 -1 127 0 0 1 0 0 0 0 0 0 0 112 -70 43 81 -1 127 0 0 0 64 -108 14 1 0 0 0 72 50 -13 110 -1 127 0 0 -128 -70 43 81 -1 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 96 -70 43 81
88 90 72 88 -1 127 0 0 88 90 72 88 -1 127 0 0 1 0 0 0 0 0 0 0 112 90 72 88 -1 127 0 0 0 -96 119 7 1 0 0 0 72 18 72 105 -1 127 0 0 -128 90 72 88 -1 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 96 90 72 88
88 -6 -79 87 -1 127 0 0 88 -6 -79 87 -1 127 0 0 1 0 0 0 0 0 0 0 112 -6 -79 87 -1 127 0 0 0 0 14 8 1 0 0 0 72 34 57 104 -1 127 0 0 -128 -6 -79 87 -1 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 96 -6 -79 87
Am wahrscheinlichsten ist, dass Ihre nicht nullterminierte Zeichenkette versehentlich null-terminiert wird, da temp[strlen(str)]
durch eine Zufallsvariable %code%
ist. p>