2

キャストしようとconst char*するchar*とクラッシュします:

int myfunc(const char*);
const char * str = "test";
myfunc( (char*)str ) // crash

どうやってやるの?

4

2 に答える 2

4

あなたがしていることは未定義の動作です。

が指すメモリを変更することはできませんstr。変更できるものが必要な場合は、代わりに次のように宣言します。

char str[] = "test";

これにより、文字列リテラルの変更可能なコピーが作成さ"test"れます。

于 2013-04-15T15:52:00.527 に答える
3

アップデート

文字列リテラルを変更しようとすると、未定義の動作になります。ドラフト C++ 標準セクション2.14.5 Stringlitersパラグラフ12を見ると、次のように述べられています。

すべての文字列リテラルが異なる (つまり、重複しないオブジェクトに格納される) かどうかは、実装で定義されます。文字列リテラルを変更しようとした場合の影響は未定義です。

クラッシュは、未定義の動作の可能性のある多くの結果の 1 つです。プログラムが正常に動作しているように見える場合もあります。

または、次のように自動配列を作成することもできます。

char str[] = "test" ;

これには、後で変更できる文字列リテラルのコピーが含まれます。

オリジナル

文字列リテラルを変更するとmyfunc、未定義の動作が発生し、プログラムがクラッシュしやすくなります。

于 2013-04-15T15:52:10.087 に答える