2011-01-13 12 views
31

Was ist der Unterschied zwischen diesen beiden in Bezug auf Speicherzuweisung.Speicherzuweisung char * und char []

char *p1 = "hello"; 
char p2[] = "hello"; 
+13

Die erste sollte 'const char *' sein! – rubenvb

+0

'p1' benötigt 4 oder 8 Bytes (erforderlich zum Speichern einer Speicheradresse), die plattformabhängig sind. 'p2' benötigt 6 Bytes (= 5 Bytes für die Zeichenfolge' Hallo' + 1 Byte für das Null-Beendigungszeichen). – RBT

Antwort

35

Der erste, der einen Zeiger Variable (auf der Plattform je vier oder acht Byte Speicher) erzeugt und speichert eine Lage eine Zeichenkette gibt literal, die zweite erzeugt einen Array von sechs Zeichen (einschließlich Zero String Terminator Byte) und kopiert dort das Literal.

Sie sollten eine Compiler-Warnung in der ersten Zeile erhalten, da das Literal const ist.

+0

Wo genau ist das String-Literal gespeichert? Ist es in Haufen? – blitzkriegz

+10

Das Zeichenfolgenliteral wird normalerweise in einem Bereich des Speichers gespeichert, der getrennt von dem Stapel und dem ('new' /' delete'verwalteten) Heap ist. Je nach Ihrer Plattform ist diese Region möglicherweise kopiergeschützt. Wenn Sie also darauf schreiben, wird das Programm abstürzen. –

+0

Vielen Dank für die kristallklare Antwort. – blitzkriegz

8

Der erste ist ein nicht-konstanter Zeiger auf const (schreibgeschützt) Daten, der zweite ist ein nicht-constant Array.

+0

Also ist Char * p1 = "Hallo" entspricht char const * p1 = "Hallo"? – blitzkriegz

+3

@Mahatma: Ja, und das ist auch das gleiche wie die besser lesbare und intuitive Version: 'const char * p1 =" Hallo "'. –

+2

@Mahatma: Ja, aber die erste ist gefährlich: Ohne eine 'const'-Qualifizierung gibt es keinen Compiler-Schutz gegen den Versuch, das String-Literal zu modifizieren, was zu undefiniertem Verhalten führt. –

6

Da die erste eine nicht konstante Zeiger auf const ist (read-only) Daten, die zweite ist eine nicht-const-Array ist, wie Paulus sagte, können Sie schreiben:

p2[2]='A'; //changing third character - okay 

Aber man kann nicht schreiben:

p1[2]='A';//changing third character - runtime error! 
+1

Der zweite Fall ist tatsächlich schlimmer als ein Kompilierungsfehler; der Compiler wird es höchstwahrscheinlich akzeptieren und unbestimmtes Laufzeitverhalten geben. –

+1

Das stimmt nicht - er wird keinen Kompilierfehler bekommen, da das String-Literal nicht const ist. Er wird jedoch UB bekommen. – Puppy

+0

@DeadMG: behoben. :-) – Nawaz

Verwandte Themen