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

时间:2012-04-03 20:52:34

标签: c

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

  

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

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

  

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

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

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

1 个答案:

答案 0 :(得分:13)

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

  

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

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

  

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

     

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

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

  

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