2013-03-12 3 views
7

私は変数(char *)からconst-nessを削除しようとしていますが、何らかの理由で値を変更しようとすると、const変数の元の値は変わりません。 str2の変化の変数からconst-nessを削除する

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

は現在値が、STR1の元の値は同じまま、私はGoogleでそれを見てきたが、明確な答えを見つけることができませんでした。

const_castを使用して値を変更する場合、const変数の元の値も変更する必要がありますか?

答えて

10

str1のタイプはconst char*です。 charconstであり、ポインタではありません。つまり、const charへのポインタです。それはあなたがこれを行うことはできません意味:constchar秒のいずれかの値を変更します

str1[0] = 't'; 

ここでは、str2 = "tna";を実行しているときにポインタの値が変更されています。それはいいです。 str2を別の文字列リテラルを指すように変更するだけです。今すぐstr1str2は異なる文字列を指しています。あなたの非constポインタstr2

、あなたstr2[0] = 't';を行うことができます - しかし、あなたは未定義の動作を持っていると思います。元々constと宣言されたものは変更できません。特に、文字列リテラルは読み込み専用メモリに格納され、それらを変更しようとするとひどい不幸が生じます。

リテラル文字列を取り、安全にそれを変更し、それに配列を初期化したい場合:

char str1[] = "david"; 

これはchar配列を超える文字列リテラルから文字をコピーします。その後、好みに合わせて変更することができます。

+0

これで、キャストを使用してconst char *変数の値を変更する方法はありますか? –

+0

@DavidFaizキャストなしでポインタをうまく変更できます。あなたが持っている文字列リテラルを指すようにポインターを設定していれば、 'char'を変更することはできません。文字列リテラルは定数です。文字列リテラルを配列にコピーする方法については、最新の編集を参照してください。 –

+0

ちょうどそれを見て、それを持っていた! すぐに返信いただきありがとうございます! 基本的にリテラル文字列を変更することはできませんが、const char変数を使用して異なる文字列を参照するだけです。 –

3

str2は単なるポインタです。そしてあなたのコードはポインタの値を変更します。アドレスではなく、ポインタが指す文字列ではありません。

さらに、実行しようとしているのは未定義の動作になり、実行時にエラーが発生する可能性が高くなります。現代のコンパイラはすべてあなたの文字列"david"を読み取り専用メモリに格納します。そのメモリを変更しようとすると、メモリ保護エラーが発生します。

関連する問題