9

変数 (char*) から const 性を削除しようとしていますが、何らかの理由で値を変更しようとすると、const 変数の元の値が変更されません。

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

現在、str2 の値は変更されていますが、str1 の元の値は同じままです。Google で調べましたが、明確な答えが見つかりませんでした。

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

4

2 に答える 2

10

の型はstr1ですconst char*。それはであり、ポインターではありませんcharconstつまり、へのポインタconst charです。つまり、これを行うことはできません:

str1[0] = 't';

これにより、いずれかの値が変更されますconst char

さて、あなたがしていることstr2 = "tna";は、ポインターの値を変更することです。それはいいです。str2別の文字列リテラルを指すように変更しているだけです。現在str1、 とstr2は別の文字列を指しています。

あなたの non - constpointerstr2で、あなたはすることができますstr2[0] = 't';- しかし、あなたは未定義の振る舞いをするでしょう。最初に宣言されたものを変更することはできませんconst。特に、文字列リテラルは読み取り専用メモリに格納されているため、それらを変更しようとすると、ひどい不幸が生じます。

文字列リテラルを取得して安全に変更したい場合は、それを使用して配列を初期化します。

char str1[] = "david";

これにより、文字列リテラルからchar配列に文字がコピーされます。その後、好みに合わせて変更できます。

于 2013-03-12T10:03:01.297 に答える
3

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

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

于 2013-03-12T10:02:46.887 に答える