Ich versuche eine Zeichenfolge umzukehren.
Dies ist der Code, den ich ausprobiert habe:
%Vor% Der Code gibt ein Bus error : 10
aus.
Aber wenn ich den gleichen Code wie schreibe:
%Vor%Es funktioniert perfekt.
Warum ist der erste Code, der Busfehler oder Segmentierungsfehler verursacht?
Der Busfehler tritt auf, weil in vielen (wenn nicht den meisten oder allen modernen) C-Compilern String-Literale im schreibgeschützten Speicher zugewiesen werden.
Sie kehren die Zeichenfolge an Ort und Stelle um. In Ihrem ersten Code-Snippet versuchen Sie, in ein String-Literal zu schreiben. Keine gute Idee.
Im zweiten Fall haben Sie einen String mallokiert, der ihn auf den Haufen legt. Es ist jetzt sicher, diese Zeichenfolge an Ort und Stelle umzukehren.
ANHANG
Für den Kommentator, der nach Segfaults und Busfehlern gefragt hat, ist das eine gute Frage. Ich habe beides gesehen. Hier ist ein Busfehler auf einem Mac:
%Vor%Auf anderen Betriebssystemen / Compilern können Sie tatsächlich einen segfault erhalten.
Das Kopieren auf den Heap ist eine Option. Wenn Sie jedoch nur ein lokales (Stapel-) Array zuweisen möchten, können Sie Folgendes tun:
%Vor%Dann wird die konstante Zeichenfolge in den Stapel kopiert.
In Form von "I am a good boy"
angegebene Zeichenfelder sind normalerweise konstant - Sie können sie nicht ändern. Deshalb stürzt deine erste Variante ab. Die zweite nicht, wie Sie eine Kopie der Daten machen und dann ändern.
char * str="Ich bin ein guter Junge"; Wird es als Literal behandelt und versucht, es zu ändern, führt dies zu einem Busfehler. Es entspricht const char * str="Ich bin ein guter Junge", d. H. Zeiger auf eine konstante Zeichenkette und versuchen, eine konstante Zeichenkette zu ändern ist nicht erlaubt.
BEARBEITEN: In dem Moment, in dem Sie malloc () und kopieren, spielen Sie mit einer Kopie des ursprünglichen Strings und ptr hat nicht den Typ 'const char *', sondern 'char * ptr' und beschweren sich nicht.
Das Kompilieren mit c ++ (g ++) zeigt die Verweigerung der Zuweisung eines Zeichenfolgenliterals zu einem nichtkonstanten Zeichen *, das diesen Fehler verhindern soll:
%Vor%Die entsprechende Warnung befindet sich in Zeile 5.
Wenn die Deklaration wie angegeben in const char * geändert wird, werden die Zuweisungen in die literale Zeichenfolge verhindert.
Dies ist auch eine Lektion, warum Sie Warnungen nicht ignorieren sollten.
Tags und Links string c string-literals