根据C89标准,字符串文字的修改行为是否未定义?

根据C89标准,字符串文字的修改行为是否未定义?,c,C,我相信在C99中,字符串文本的修改是未定义的行为。我没有该标准的副本,但我有一份C1X(n1570)草案,该草案在6.4.5第7段中规定: 如果这些数组的元素具有 适当的值。如果程序试图修改这样的数组,则该行为是 未定义 我发现了一个涉及此主题的堆栈溢出,包含Jonathan Leffler的以下评论: 最初,C89(C90)标准并不禁止修改文字,因为在该标准之前编写的代码太多,可能会被其破坏 但是我也看到了很多关于字符串文本类型的讨论,以及它们是char[N]而不是const char[N]的

我相信在C99中,字符串文本的修改是未定义的行为。我没有该标准的副本,但我有一份C1X(n1570)草案,该草案在6.4.5第7段中规定:

如果这些数组的元素具有 适当的值。如果程序试图修改这样的数组,则该行为是 未定义

我发现了一个涉及此主题的堆栈溢出,包含Jonathan Leffler的以下评论:

最初,C89(C90)标准并不禁止修改文字,因为在该标准之前编写的代码太多,可能会被其破坏

但是我也看到了很多关于字符串文本类型的讨论,以及它们是
char[N]
而不是
const char[N]
的事实。我推测做出这个决定是为了避免大量现有代码被破坏


谁能给我一个明确的答案。字符串文字修改在C89中是UB吗?

是的,它们在C89中是不可修改的

(C90,6.1.4)“如果程序试图修改任一形式的字符串文字,则行为未定义”

即使在K&R第二版中,也有关于字符串文本不变性的引用

(K&R2,5.5)“如果试图修改字符串内容,则结果未定义”

(K&R2,附录C)“字符串不再可修改,因此可以放在只读内存中”

在ANSI C89的基本原理中,有一种解释说明了为什么它是不可修改的:

(ANSI C89基本原理,3.1.4)“字符串文字被指定为不可修改。此规范允许实现共享具有相同文本的字符串副本,将字符串文字放置在只读内存中,并执行某些优化。”


什么?据我所知,字符串文字是
const char*
…@H2CO3:不是用C写的。我记得看到一个古老的程序将相同的字符串合并到目标代码中,使其更小,所以即使在C89之前修改字符串文字也是个坏主意。