为什么我不能在C语言中修改字符串字面量?

5

我试图理解在C语言中不能修改字符串常量的原因。

为什么以下操作在C语言中是不合法的?

char* p = "abc";
*p = 'd';

这不是违法的,就像你写的一样。你的代码将能够在C(以及C ++)中编译通过。 - Adrian Mole
10
@Adrian:仅仅因为代码编译通过并不意味着它是合法/有效的。实际上并不是这样。 - R.. GitHub STOP HELPING ICE
声明 char* p = "abc";p 声明为指向一个包含四个字符的数组的指针;语句 *p = 'd'; 将值 d 赋给该数组的第一个元素。这段代码有什么问题? - Adrian Mole
5
@Adrian:C 2018年6.4.5中写道,源代码中由字符串字面量创建的数组,“如果程序试图修改这样的数组,则行为是未定义的”。在C++中,字符串字面量是一个由const字符构成的数组,而从const char*char*的隐式转换在char* p="abc";中是不被允许的。 - Eric Postpischil
@EricPostpischil 很有趣!总是乐于学习新东西。我刚在MSVC中尝试了这个:char*p = "abc", q[4] = "abc"; *p = 'd'; *q = 'd'; printf("%s %s\n", p, q); …它编译并运行,但输出为 abc dbc。我想我必须认输了,在这个问题上! - Adrian Mole
2
这真的是一个重复的问题吗?另一个问题似乎在问为什么提问者期望的东西不起作用。而这个问题似乎在问语言为什么是这样的。请参见:“不能做某事的原因”。 - R.. GitHub STOP HELPING ICE
1个回答

11

来自C89标准解释,3.1.4字符串字面值:

字符串字面值被规定为不可修改的。这一规定使得实现可以共享具有相同文本的字符串副本,将字符串字面值放置在只读存储器中并执行某些优化。然而,字符串字面值没有const char数组类型,以避免指针类型检查的问题,尤其是与库函数相关,因为将const char指针赋值给char指针是无效的。坚持字符串字面值应该是可修改的委员会成员认为这种做法可以指定为常见的扩展(请参阅F.5.5)。


这个合法吗:char q[4] = "abc"; *q = 'd'; - Adrian Mole
1
@Adrian 是的,这是合法的,因为在这种情况下,字符串字面量的副本存储在 q 中。你修改的是字符串字面量的副本,而不是字符串字面量本身。 - Pablo
@Pablo - 请看我在原帖问题中的评论:我错了,R.. 是正确的! - Adrian Mole
@Adrian 我不明白你的意思。我看到 R.. 是正确的。但是我在这个答案的第一个评论中回答了你的问题。 - Pablo
@Pablo,我承认在问题的评论中我错了(这也促使我在这里发表评论)。我从未暗示你所说的任何话是错的。很抱歉造成了混淆。 - Adrian Mole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接