C++中的char数组赋值

Assigning value to char array in C++

为什么下面的代码给我一个分段错误。

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;
}

"something" 变量在两者中都是一个字符数组,那么为什么我不能在第一个示例中将字符文字分配给数组的第三个元素?

编译器可以自由地将带引号的字符串放入只读内存段并合并重复的带引号字符串,否则假设您永远不会写入带引号的字符串。但是语言取决于这样一个事实,即带引号的字符串伪装成 char*,即使它只作为 char const*

才真正有意义

将带引号的字符串作为 char* 的语言设计选择对于 C 兼容性是必要的,但对于那些使用 C++ 的人来说是一种奇怪的行为。

语法 char something[] = "hello\n"; 是 C 兼容性的另一个奇怪之处,它与带引号的字符串的正常含义的差异超出您的预期。引用的字符串在 运行 时间可能存在也可能不存在(对编译器来说最简单的)。 char 数组被初始化以匹配引用的字符串(如果它存在的话)。但是它是一个char数组,而不是带引号的字符串,所以它是可以自由写入的。