5

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

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

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

最初,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 基本原理,3.1.4)“字符串文字被指定为不可修改。该规范允许实现共享具有相同文本的字符串副本,将字符串文字放置在只读内存中,并执行某些优化。”

于 2012-04-03T20:54:16.247 回答