5

C99 では、文字列リテラルの変更は未定義の動作だと思います。私はその標準のコピーを持っていませんが、6.4.5 パラグラフ 7 に記載されている C1X (n1570) のドラフトを持っています。

これらの配列の要素が適切な値を持っている場合、これらの配列が異なるかどうかは指定されていません。プログラムがそのような配列を変更しようとした場合、動作は未定義です。

このトピックに触れ、Jonathan Leffler からの次のコメントを含むStack Overflow の質問を見つけました。

もともと、C89 (C90) 標準はリテラルの変更を禁止していませんでした。これは、標準より前に書かれたコードがあまりにも多く、それによって破られる可能性があるためです。

しかし、文字列リテラルのや、文字列リテラルchar[N]const char[N]. この決定は、既存のコードの大部分が壊れないようにするために行われたものだと思います。

誰も私に決定的な答えを与えることができますか?文字列リテラル修飾は C89 で UB ですか?

4

1 に答える 1

14

はい、C89 では変更できません。

(C90、6.1.4) 「プログラムがいずれかの形式の文字列リテラルを変更しようとした場合、動作は未定義です」

K&R 第 2 版でも、文字列リテラルの不変性に関する引用があります。

(K&R2, 5.5) 「文字列の内容を変更しようとすると、結果は未定義です」

(K&R2、付録 C) 「文字列は変更できなくなったため、読み取り専用メモリに配置される可能性があります」

ANSI C89 Rationale には、変更不可である理由の説明があります。

(ANSI C89 Rationale, 3.1.4) 「文字列リテラルは変更不可能であると指定されています。この仕様により、実装は文字列のコピーを同一のテキストと共有し、文字列リテラルを読み取り専用メモリに配置し、特定の最適化を実行できます。」

于 2012-04-03T20:54:16.247 に答える