可以修改字符串文字和非字符串非复合文字吗?

Tim*_*Tim -3 c literals string-literals

字符串文字是左值,它打开门以修改字符串文字.

来自C in a Nutshell:

在C源代码中,文字是表示固定值的标记,可以是整数,浮点数,字符或字符串.文字的类型由其值和符号决定.这里讨论的文字不同于C99标准中引入的复合文字.复合文字是普通的可修改对象,类似于变量.

虽然 C不严格禁止修改字符串文字,但您不应尝试这样做.首先,编译器将字符串文字视为常量,可将其置于只读存储器中,在这种情况下,尝试的写操作会导致错误.另一方面,如果程序中使用了两个或多个相同的字符串文字,编译器可能会将它们存储在同一位置,因此当您访问另一个时,修改它会导致意外结果.

  1. 第一段说"C中的字面值表示固定值".

    • 这是否意味着不应修改文字(复合文字除外)?

    • 由于字符串文字不是复合文字,是否应修改字符串文字?

  2. 第二段说"编译器不会严格禁止修改字符串文字".那么字符串文字应该被修改吗?
  3. 这两段是否相互矛盾?我怎么理解他们?

  4. 可以修改既不是复合文字也不是字符串文字的文字?

Vla*_*cow 8

来自C标准(6.4.5字符串文字)

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

至于你的陈述.

第二段说"编译器不会严格禁止修改字符串文字".那么字符串文字应该被修改吗?

然后编译器不会修改字符串文字.它们可以将相同的字符串文字存储为一个数组.

正如@ o11c在附件J评论指出(资料)可移植性问题有书面

J.5常用扩展

1以下扩展在许多系统中广泛使用,但不能移植到所有实现.包含任何可能导致严格符合程序无效的扩展会导致实现不一致.此类扩展的示例包括新关键字,标准标头中声明的额外库函数或名称不以下划线开头的预定义宏.

J.5.5可写字符串文字

1字符串文字是可修改的(在这种情况下,相同的字符串文字应表示不同的对象)(6.4.5).


PSk*_*cik 5

不要修改字符串文字.把他们视为char const[].字符串文字是有效的char const[](修改它们导致未定义的行为),但由于遗留原因它们确实存在char [],这意味着编译器不会阻止您写入它们,但如果您这样做,您的程序仍将是未定义的.