为什么下面的代码会给我一个分段错误。
int main()
{
char *something = "hello\n";
something[2] = 'a'; // doesn't work
*(something+2) = 'a'; // this doesn't work either
return 0;
}
但是下面的代码工作正常。
int main()
{
char something[] = "hello\n";
something[2] = 'a'; //works fine
*(something+2) = 'a'; //works fine
return 0;
}
"某事"变量是两者中的char数组,那么为什么我不能在第一个例子中将字符文字分配给数组的第三个元素?
答案 0 :(得分:1)
编译器可以自由地将引用的字符串放入只读的内存段中并合并重复的引用字符串,否则假设您永远不会写入带引号的字符串。但是语言取决于引用的字符串假装是char*
的事实,即使它仅作为char const*
引用字符串为char*
的语言设计选择对于C兼容性是必需的,但对于在C ++中工作的人来说这是一种奇怪的行为。
语法char something[] = "hello\n";
是C兼容性的另一个奇怪之处,并且与引用字符串的正常含义相比有所不同。引用的字符串在运行时可能存在也可能不存在(编译器最简单)。初始化char数组以匹配引用的字符串(如果它已存在)。但是它是一个char数组,而不是带引号的字符串,因此可以自由写入。