Zeichenfolge im Funktionsparameter

7
%Vor%

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.

%Vor%
  1. Wie unterscheidet es sich im Kontext des Funktionsparameters?
  2. Es wird kein Speicher für Funktionsparameter zugewiesen?

Bitte teilen Sie Ihr Wissen.

    
Jeyaram 14.06.2013, 14:44
quelle

3 Antworten

17

In der Funktionsparameterliste ist char arr[] absolut gleichbedeutend mit char *arr , also sind das Definitionspaar und das Deklarationspaar äquivalent.

%Vor%

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.

    
Jonathan Leffler 14.06.2013, 14:48
quelle
6
%Vor%

ist ähnlich wie

%Vor%

"MyString" ist in beiden Fällen ein String-Literal und in beiden Fällen ist die Zeichenfolge nicht änderbar.

%Vor%

übergibt die Adresse eines Zeichenfolgenliterals an function als Argument.

    
ouah 14.06.2013 14:47
quelle
1

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.

    
Nitin Singh 23.05.2016 20:49
quelle