代码之家  ›  专栏  ›  技术社区  ›  Some Name

取消分隔指针并为其赋值[重复]

  •  -1
  • Some Name  · 技术社区  · 6 年前

    我对这种行为很困惑:

    int main(void) {
        char *test_string = "test_string";
        *test_string = 'a'; //segfaults
        return 0;
    }
    

    DEMO

    int main(void) {
        char test_string[] = "test_string";
        *test_string = 'a'; //OK
        return 0;
    }
    

    DEMO

    我原以为从那以后也会这样 N1570, Section 6.3.2.1(p3) 声明如下:

    除非它是 sizeof 运算符 _Alignof 操作员,或 unary & 运算符,或是用于 初始化数组,类型为___数组的表达式为 转换为具有类型___指针的表达式,指向类型__ 数组对象的初始元素,不是左值。

    为什么第一个SegFault?

    1 回复  |  直到 6 年前
        1
  •  6
  •   Sourav Ghosh    6 年前

    第一种情况的问题是, test_string 指向A string literal 你在尝试修改字符串文字。这个调用 undefined behavior

    引用 C11 ,第§6.4.5章

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

    另一方面,在第二种情况下, 测试字符串 是一个数组,它是可修改的。