我试图理解在C语言中不能修改字符串常量的原因。
为什么以下操作在C语言中是不合法的?
char* p = "abc";
*p = 'd';
我试图理解在C语言中不能修改字符串常量的原因。
为什么以下操作在C语言中是不合法的?
char* p = "abc";
*p = 'd';
字符串字面值被规定为不可修改的。这一规定使得实现可以共享具有相同文本的字符串副本,将字符串字面值放置在只读存储器中并执行某些优化。然而,字符串字面值没有const char数组类型,以避免指针类型检查的问题,尤其是与库函数相关,因为将const char指针赋值给char指针是无效的。坚持字符串字面值应该是可修改的委员会成员认为这种做法可以指定为常见的扩展(请参阅F.5.5)。
char q[4] = "abc"; *q = 'd';
? - Adrian Moleq
中。你修改的是字符串字面量的副本,而不是字符串字面量本身。 - Pablo
C
(以及C ++
)中编译通过。 - Adrian Molechar* p = "abc";
将p
声明为指向一个包含四个字符的数组的指针;语句*p = 'd';
将值d
赋给该数组的第一个元素。这段代码有什么问题? - Adrian Moleconst
字符构成的数组,而从const char*
到char*
的隐式转换在char* p="abc";
中是不被允许的。 - Eric Postpischilchar*p = "abc", q[4] = "abc"; *p = 'd'; *q = 'd'; printf("%s %s\n", p, q);
…它编译并运行,但输出为abc dbc
。我想我必须认输了,在这个问题上! - Adrian Mole