In dem obigen Programm befindet sich HelloWorld
im schreibgeschützten Abschnitt (d. h. Zeichenkettentabelle). x
verweist auf diesen schreibgeschützten Abschnitt. Daher ist der Versuch, diese Werte zu ändern, ein nicht definiertes Verhalten.
Aber y
wird im Stack zugewiesen und HelloWorld
wird in diesen Speicher kopiert. Das Modifizieren funktioniert also gut. String-Literale: Zeiger vs. Char-Array
Hier ist meine Frage:
Im folgenden Programm verursachen sowohl char *arr
als auch char arr[]
Segmentierungsfehler, wenn der Inhalt geändert wird.
Bitte teilen Sie Ihr Wissen.
In der Funktionsparameterliste ist char arr[]
absolut gleichbedeutend mit char *arr
, also sind das Definitionspaar und das Deklarationspaar äquivalent.
Das Problem ist der aufrufende Kontext. Sie haben der Funktion ein Zeichenfolgenliteral übergeben. Zeichenfolgenliterale dürfen nicht geändert werden; Ihre Funktion hat versucht, das angegebene String-Literal zu ändern. Ihr Programm hat nicht definiertes Verhalten aufgerufen und ist abgestürzt. Alles komplett koscher.
Behandle String-Literale so, als wären sie static const char literal[] = "string literal";
und versuche nicht, sie zu modifizieren.
char * arr; Die obige Anweisung impliziert, dass arr ein Zeichenzeiger ist und auf ein Zeichen oder Zeichenfolgen
zeigen kann& amp; Zeichen arr []; Die obige Anweisung impliziert, dass arr Zeichenfolgen ist und so viele Zeichen wie möglich oder sogar nur eins speichern kann, aber immer mit dem Zeichen '\ 0' rechnet, wodurch es zu einer Zeichenkette wird (z.B. char arr []="a" ist ähnlich char arr [] = {'a', '\ 0'})
Aber wenn er als Parameter in aufgerufenen Funktionen verwendet wird, wird die übergebene Zeichenkette zeichenweise in formalen Argumenten gespeichert, die keinen Unterschied machen.
Tags und Links c gcc string-literals function-parameter