【问题标题】:Modifying string value causes access violation [duplicate]修改字符串值导致访问冲突[重复]
【发布时间】:2020-09-25 05:43:16
【问题描述】:

我有以下代码:

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

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

任何想法为什么会发生这种情况。奇怪的是,我不记得在运行 Visual Studio 的旧机器上发生过这个错误,而是在 GCC 和 Pellas C 上发生。

【问题讨论】:

    标签: c string-literals


    【解决方案1】:

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

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

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

    [...]如果程序试图修改这样的数组,则行为未定义。

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

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

    【讨论】:

    • 我将如何使用 C11 实现我的目标?
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 2012-01-12
      相关资源
      最近更新 更多