8

私が行った場合:

const char* const_str = "Some string";

char* str = const_cast<char*>(const_str); // (1)

str[0] = "P"; // (2)

未定義動作はどこ(どの行)に正確にありますか?

私はSOでこれをたくさん探してきましたが、明確で正確な答えは見つかりませんでした(または、少なくとも、私が理解できるものはありませんでした)。

また、関連:この種の関数を提供する外部ライブラリを使用する場合:

// The documentation states that str will never be modified, just read.
void read_string(char* str);

次のようなものを書いて大丈夫ですか?

std::string str = "My string";

read_string(const_cast<char*>(str.c_str()));

私は確かにそれread_string()が書き込もうとしないstrことを知っているので?

ありがとうございました。

4

2 に答える 2

9

行(2)には未定義の動作があります。コンパイラは自由に定数を読み取り専用メモリに配置できるため(Windowsではかつてこれは「データセグメント」でした)、コンパイラに書き込むとプログラムが終了する可能性があります。またはそうではないかもしれません。

不十分に定義されたライブラリ関数(constである必要があるnon-constパラメーター)を呼び出すときにconst-nessをキャストしなければならないことは、残念ながら、珍しいことではありません。それをしなさい、しかしあなたの鼻を保持しなさい。

于 2011-04-04T07:58:39.407 に答える
-1

コンパイラがプロセスの読み取り専用セクションに入れた可能性のある定数文字列を変更しようとしています。これの方が良い:

char str[32];
strcpy(str, "Some string");
str[0] = "P";
于 2011-04-04T07:59:46.790 に答える