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

Dav*_*nan 5 c

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

如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的.如果程序试图修改此类数组,则行为未定义.

我发现了一个涉及此主题的Stack Overflow 问题,其中包含Jonathan Leffler的以下评论:

最初,C89(C90)标准并没有禁止修改文字,因为在标准之前编写的代码太多会被它破坏.

但是,我也看到很多的讨论类型的字符串文字和事实,他们是char[N]const char[N].我认为这个决定是为了使大量现有代码不会破坏.

任何人都可以给我一个明确的答案.在C89中是字符串文字修改UB吗?

oua*_*uah 13

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

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

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

(K&R2,5.5)"如果你试图修改字符串内容,结果是不确定的"

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

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

(ANSI C89理由,3.1.4)"字符串文字被指定为不可修改的.本说明书允许实现共享相同的文本串,以放置在只读存储器字符串文字,以及执行某些优化的副本".