修改字符串值导致访问冲突
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
我有以下代码:
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