C99 では、文字列リテラルの変更は未定義の動作だと思います。私はその標準のコピーを持っていませんが、6.4.5 パラグラフ 7 に記載されている C1X (n1570) のドラフトを持っています。
これらの配列の要素が適切な値を持っている場合、これらの配列が異なるかどうかは指定されていません。プログラムがそのような配列を変更しようとした場合、動作は未定義です。
このトピックに触れ、Jonathan Leffler からの次のコメントを含むStack Overflow の質問を見つけました。
もともと、C89 (C90) 標準はリテラルの変更を禁止していませんでした。これは、標準より前に書かれたコードがあまりにも多く、それによって破られる可能性があるためです。
しかし、文字列リテラルの型や、文字列リテラルchar[N]
がconst char[N]
. この決定は、既存のコードの大部分が壊れないようにするために行われたものだと思います。
誰も私に決定的な答えを与えることができますか?文字列リテラル修飾は C89 で UB ですか?