为什么在这个C程序中写入string文字段错误?

#include<stdio.h> void main() { char *p="nyks"; p[2]='n'; printf("%s",p); } 

这与分段故障崩溃。 有人能解释为什么吗?

标准规定文字string被定义为const 。 你不能改变它。

编译器将文字放置在只读存储器部分。 你可以输出程序集并观察这个。 如果您正在使用GCC,则通过-s标志完成。 它会把string放在一个.rodata节中。

尝试覆盖string文字是未定义的行为。 C99§6.4.5/ 6:

如果程序试图修改这样一个数组,行为是不确定的。

这在附录J.2(未定义的行为)中重述。

如果你这样做:

 char p[] = "nyks"; 

你可以分配和初始化一个自动(堆栈)字符数组。 在这种情况下,修改元素是完全正确的。

其他的答案是从标准的angular度来看,但这是为什么它崩溃。

编译器通常把程序文字(特别是string)放在只读存储器中。 内存被操作系统标记为只读,所以任何写入的尝试都会被困住,在你的平台上,这就是分段故障所表示的内容。 试图对一些不允许的内存进行操作。 另一种与内存使用不良相关的崩溃是一个总线错误,通常表示一个不alignment的内存访问或写入一个根本没有映射的页面。 对于C代码来说,差异几乎是完全学术的(一些其他语言实现使用这些故障来帮助他们pipe理内存)。

请注意,将写入陷阱写入只读与语言的官方语义无关。 虽然你可能有一个char*指向它,你仍然不能写它。 总是把程序文字看作是指向不变的内存,而不会出错(它们不是默认情况下是因为需要支持与旧程序的兼容性)。

这意味着(本质上):

  #include<stdio.h> const char privatestring[5] = {"nyks"}; void main() { char *p = const_cast<char*>(privatestring); p[2]='n'; printf("%s",p); } 

允许编译器将privatestring放在只有读权限的地方。 它的const_cast与向前写的程序的向后兼容性是const关键字。

该值是一个string文字,因为文字存储在只读存储器中,所以无法修改,请尝试p [] .segmentation错误通常是由于错误使用指针而发生的。

string文字不可修改…编写char *p="nyks"; 实际上是C中的一个types系统孔