【问题标题】:Is modification of string literals undefined behaviour according to the C89 standard?是否根据 C89 标准修改字符串文字未定义的行为?
【发布时间】:2012-04-03 20:52:34
【问题描述】:

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

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

我发现了一个 Stack Overflow question 涉及到这个主题并包含来自 Jonathan Leffler 的以下评论:

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

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

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

【问题讨论】:

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

标签: c


【解决方案1】:

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

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

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

(K&R2, 5.5) "如果尝试修改字符串内容,结果未定义"

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2021-10-21
    • 2016-07-07
    • 2017-07-27
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    相关资源
    最近更新 更多