修改字符串值导致访问冲突

Modifying string value causes access violation

我有以下代码:

int main()
{
    char *input = "why isn't this possible?";
    input[0] = 'W';
    return 0;
}

我想修改字符串的第一个值,但似乎会导致 input[0] = 'W'; 行出现访问冲突。

知道为什么会这样。奇怪的是,我不记得这个错误发生在我的旧机器上 运行 Visual Studio,但发生在 GCC 和 Pellas C 上。

首先,您尝试修改的不是字符串,而是 string literal

是的,您会在不同情况下看到不同的行为,因为提到此尝试在 C 标准中表现出 undefined behaviour

引用 C11,第 6.4.5 章,字符串文字

[...]If the program attempts to modify such an array, the behavior is undefined.

要达到预期的输出,您可以简单地使用一个数组,由字符串文字初始化,然后尝试修改数组元素。类似于:

int main(void)
{
    char input[ ] = "why isn't this possible?";  // an array
    input[0] = 'W';                              // perfectly modifiable
    return 0;
}

任何修改 C 字符串文字的尝试都具有未定义的行为。编译器可能会安排将字符串文字存储在 read-only 内存中(受 OS 保护,而不是字面上的 ROM,除非您在嵌入式系统上)。但是语言不需要这个;作为程序员,这取决于您是否正确。 如果你想要这个功能,试试这个:

int main()
{
    char input[] = "why isn't this possible?";
    input[0] = 'W';
    return 0;
}

否则要了解更多信息,请查看此答案: Char* and char[] and undefined behaviour