Was ist der Unterschied zwischen diesen beiden in Bezug auf Speicherzuweisung.Speicherzuweisung char * und char []
char *p1 = "hello";
char p2[] = "hello";
Was ist der Unterschied zwischen diesen beiden in Bezug auf Speicherzuweisung.Speicherzuweisung char * und char []
char *p1 = "hello";
char p2[] = "hello";
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.
Wo genau ist das String-Literal gespeichert? Ist es in Haufen? – blitzkriegz
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. –
Vielen Dank für die kristallklare Antwort. – blitzkriegz
Der erste ist ein nicht-konstanter Zeiger auf const (schreibgeschützt) Daten, der zweite ist ein nicht-constant Array.
Also ist Char * p1 = "Hallo" entspricht char const * p1 = "Hallo"? – blitzkriegz
@Mahatma: Ja, und das ist auch das gleiche wie die besser lesbare und intuitive Version: 'const char * p1 =" Hallo "'. –
@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. –
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!
Der zweite Fall ist tatsächlich schlimmer als ein Kompilierungsfehler; der Compiler wird es höchstwahrscheinlich akzeptieren und unbestimmtes Laufzeitverhalten geben. –
Das stimmt nicht - er wird keinen Kompilierfehler bekommen, da das String-Literal nicht const ist. Er wird jedoch UB bekommen. – Puppy
@DeadMG: behoben. :-) – Nawaz
Die erste sollte 'const char *' sein! – rubenvb
'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