2009-12-10 14 views
15

Ich erwarte, dass beide folgende Vektoren die gleiche Darstellung im RAM haben:C - Unterschied zwischen "Char Var []" und "Char * Var"?

char a_var[] = "XXX\x00"; 
char *p_var = "XXX"; 

Aber seltsam, ein Aufruf einer Bibliotheksfunktion vom Typ f(char argument[]) crusht die laufende Anwendung, wenn ich es f(p_var) mit nennen. Aber mit f(a_var) ist Ok!

Warum?

Antwort

26

Die erste erstellt ein Array von Zeichen mit der Zeichenfolge. Der Inhalt des Arrays kann geändert werden. Die zweite erstellt einen Zeichenzeiger, der auf ein Zeichenfolgenliteral zeigt. String-Literale können nicht geändert werden.

+0

Wie ich weiß, in ANSI C können alle geändert werden – psihodelia

+15

Sie wissen falsch. Der Standard verbietet Modifikationen von String-Literalen. –

+0

Ok, danke! Jetzt werde ich es für immer erinnern :) – psihodelia

1

Bei einer Schätzung ändert die Funktion f den Inhalt der Zeichenfolge, die an sie übergeben wird.

+0

Ja, es ändert sich. aber warum f (p_var) macht crush und f (a_var) nicht? – psihodelia

+1

weil: char * p_var = "XXX"; Kann nicht geändert werden. –

0

Arrays können (allgemein) als Zeiger behandelt werden, aber das bedeutet nicht, dass sie immer austauschbar sind. Wie der andere sagte, zeigt Ihr p_var auf ein Literal, etwas Statisches, das nicht geändert werden kann. Es kann auf etwas anderes verweisen (z. B. p_var = & a_var [0]), aber Sie können den ursprünglichen Wert, den Sie in Anführungszeichen angegeben haben, nicht ändern.

Ein ähnliches Problem besteht, wenn Sie eine Variable als definieren Array in einer Datei und dann extern - verwenden Sie es als Zeiger.

Grüße

1

Wie bereits gesagt, char *p_var = "XXX"; erzeugt einen Zeiger auf einen String-Literal, die nicht geändert werden kann, so Compiler-Implementierungen sind frei Literale wieder zu verwenden, zum Beispiel:

char *p_var = "XXX"; 
char *other = "XXX"; 

Ein Compiler könnte Wählen Sie diese Option, indem Sie "XXX" nur einmal im Speicher speichern und beide Zeiger darauf zeigen. Wenn Sie ihren Wert ändern, kann dies zu unerwartetem Verhalten führen. Aus diesem Grund sollten Sie nicht versuchen, den Inhalt zu ändern.

Verwandte Themen