2013-03-12 8 views
7

Ich versuche Const-Ness aus einer Variablen (Char *) zu entfernen, aber aus irgendeinem Grund, wenn ich versuche, den Wert zu ändern, bleibt der ursprüngliche Wert der Const-Variable immer noch gleich .Entfernen Const-Ness aus einer Variablen

const char* str1 = "david"; 
char* str2 = const_cast<char *> (str1); 
str2 = "tna"; 

nun der Wert von str2 ändert aber den ursprünglichen Wert von str1 bleibt gleich, ich sehe es habe auf Google, aber konnte keine klare Antwort finden.

Wenn Sie const_cast verwenden und den Wert ändern, sollte sich auch das Original der const-Variablen ändern?

Antwort

10

Der Typ str1 ist const char*. Es ist die char das ist const, nicht der Zeiger. Das heißt, es ist ein Zeiger auf const char. Das heißt, Sie können das nicht:

str1[0] = 't'; 

, dass der Wert eines der constchar s würde sich ändern.

Nun, was Sie tun, wenn Sie tun, ändert den Wert des Zeigers. Das ist gut. Sie ändern nur str2, um auf ein anderes Zeichenfolgenliteral zu zeigen. Jetzt zeigen str1 und str2 auf verschiedene Zeichenfolgen.

Mit Ihrem nicht const Zeiger str2, Sie könnte do str2[0] = 't'; - aber würden Sie nicht definiertes Verhalten haben. Sie können etwas nicht ändern, das ursprünglich const deklariert wurde. String-Literale werden insbesondere im Nur-Lese-Speicher gespeichert und der Versuch, sie zu modifizieren, bringt Ihnen schreckliches Unglück.

Wenn Sie einen Stringliteral nehmen wollen und ändern Sie es sicher, initialisieren ein Array mit ihm:

char str1[] = "david"; 

Dadurch werden die Zeichen aus dem Stringliteral über auf die char Array kopieren. Dann können Sie sie nach Ihren Wünschen modifizieren.

+0

Okay, gibt es eine Möglichkeit, den Wert der Variablen const char * im Casting zu ändern? –

+0

@DavidFaiz Sie können den Zeiger ohne die Besetzung einfach ändern. Sie * können das Zeichen nicht ändern, wenn Sie den Zeiger auf ein Zeichenfolgenliteral gesetzt haben, das Sie haben. String-Literale sind konstant. Siehe meine letzte Änderung für das Kopieren eines Zeichenfolgenliterals in ein Array. –

+0

Yea habe es gesehen und verstanden! vielen dank für die schnelle antwort! so im Grunde kann ich nicht die literale Zeichenfolge ändern, sondern nur die const char-Variable und zeigen auf eine andere. –

3

str2 ist einfach ein Zeiger. Und Ihr Code ändert nur den Wert des Zeigers, die Adresse, nicht die Zeichenfolge, auf die er zeigt.

Was mehr ist, was Sie versuchen zu tun, führt zu undefinierten Verhalten, und höchstwahrscheinlich zu Laufzeitfehlern. Alle modernen Compiler speichern Ihre Zeichenfolge "david" im Nur-Lese-Speicher. Versuche, diesen Speicher zu ändern, führen zu Speicherschutzfehlern.

Verwandte Themen