2017-07-14 2 views
1

wird vorgeschlagen, dass, wenn ein Puffer wie folgt erklärt:ok zum überschreiben deklariert: char * a = "abc" ;?

char * a = "one"; 

es nicht wieder überschrieben werden soll.

a = "two"; 
a = "three"; 
a = "ab"; 

Warum wäre das eine schlechte Sache?

weil dies scheint von den meisten Menschen akzeptiert werden.

char * a = ""; 
a = "abc"; 

wenn das in Ordnung ist. Warum sollten die oberen Beispiele nicht in Ordnung sein?

+2

Wer hat gesagt, dass es eine schlechte Sache sein wird?Sieht für mich OK aus. Sie haben das Konzept der String-Literale, die schreibgeschützt sind, falsch verstanden. –

+0

Es ist schreibgeschützt. –

Antwort

0

Es ist vollkommen in Ordnung, neu zu schreiben Ihre char *variable mit einem anderen "string"

Aber bedenken Sie, dass so geschrieben Strings Konstanten sind, und so werden im binären Teil Ihrer Anwendung gespeichert, steigert seine Größe.

Auch Strings, die in Ihrer Anwendung verteilt sind, machen die Wartung viel schwieriger. Sie sollten alle Ihre Zeichenfolgen in einer einzigen <headerfile.h> Datei konzentrieren und diese Datei einschließen.

Verwenden Sie dann die Konstanten, um auf die Strings zu verweisen.

0

char * a = "one"; ist im Grunde äquivalent zu

char const * a = "one"; 

Das bedeutet a modifizierbar ist, aber nicht die Zeichenkette a Punkte auf. Modifizieren a entsprechend der Anforderung des Codes ist nicht eine Übung schlecht.

1

Zuweisen a, um auf eine anderen String-Literal zu zeigen, ist nicht das Problem; Was du geschrieben hast, ist in Ordnung.

Was nicht in Ordnung ist versucht, String-Literal zu überschreiben, dass aPunkte auf zeigt. IOW, da die Linie

char * a = "abc"; 

eine der folgenden Aktionen in undefinierten Verhalten führen würde, kann Ihr Code mit der Bedeutung abstürzen, oder es kann funktionieren, oder es beschädigen kann andere Daten:

a[0] = 'A'; 
strcpy(a, "foo"); 
*a = *a + 1; 

etc .

Wenn Sie immer nur in einen String-zu-Punkt gehen wörtliche a wird wissen, ist es besser, es als const zu erklären:

const char * a = "abc"; 

Sie können immer noch a zuweisen unterschiedliche Stringliterale Punkt:

a = "foo"; 
a = "bar"; 

aber wenn Sie versuchen, a Punkte zu ändern, was wird der Compiler an Sie schreien.

Verwandte Themen