可能重复:
Why does this Seg Fault?
What is the difference between char a[] = “string”; and char *p = “string”;
试图理解为什么s [0] ='H'失败。我猜这与进程内存中的数据段有关,但是有人可以更好地解释一下吗?
void str2 (void)
{
char *s = "hello";
printf("%s\n", s);
s[0] = 'H'; //maybe this is a problem because content in s is constant?
printf("%s\n", s);
}
int main()
{
str2();
return 0;
}
答案 0 :(得分:6)
这是错误的,因为C标准表示尝试修改字符串文字会产生未定义的行为。
究竟会发生什么可以而且会有所不同。在某些情况下,它会工作" - 字符串文字的内容将更改为您所要求的内容(例如,在MS-DOS时代,通常会这样做)。在其他情况下,编译器将合并相同的字符串文字,如下所示:
char *a = "1234";
char *b = "1234";
a[1] = 'a';
printf("%s\n", b);
...会打印1a34
,即使您从未明确修改过b
。
在其他情况下(包括大多数现代系统),您可以预期尝试写入完全失败,而是抛出某种异常/信号。
答案 1 :(得分:2)
您正在尝试修改字符串文字,该文字驻留在实现定义的只读内存中,从而导致未定义的行为。请注意,未定义的行为不保证您的程序崩溃,但它可能会向您显示任何行为。
好读:
What is the difference between char a[] = ?string?; and char *p = ?string?;?
答案 2 :(得分:0)
我认为这种行为,一个好的或严厉的编译器不应该允许,因为这是(char * s =“hello”)指向常量的指针,即修改内容将导致未定义的行为,如果编译器不会对此抛出任何错误