キャストしようとconst char*
するchar*
とクラッシュします:
int myfunc(const char*);
const char * str = "test";
myfunc( (char*)str ) // crash
どうやってやるの?
キャストしようとconst char*
するchar*
とクラッシュします:
int myfunc(const char*);
const char * str = "test";
myfunc( (char*)str ) // crash
どうやってやるの?
あなたがしていることは未定義の動作です。
が指すメモリを変更することはできませんstr
。変更できるものが必要な場合は、代わりに次のように宣言します。
char str[] = "test";
これにより、文字列リテラルの変更可能なコピーが作成さ"test"
れます。
アップデート
文字列リテラルを変更しようとすると、未定義の動作になります。ドラフト C++ 標準セクション2.14.5
Stringlitersパラグラフ12を見ると、次のように述べられています。
すべての文字列リテラルが異なる (つまり、重複しないオブジェクトに格納される) かどうかは、実装で定義されます。文字列リテラルを変更しようとした場合の影響は未定義です。
クラッシュは、未定義の動作の可能性のある多くの結果の 1 つです。プログラムが正常に動作しているように見える場合もあります。
または、次のように自動配列を作成することもできます。
char str[] = "test" ;
これには、後で変更できる文字列リテラルのコピーが含まれます。
オリジナル
文字列リテラルを変更するとmyfunc
、未定義の動作が発生し、プログラムがクラッシュしやすくなります。