为什么将字符串中的字符分配给自身的总线错误?

时间:2016-11-04 07:44:05

标签: c

这可以产生并产生bbcd,因为我期待。

#include <stdio.h>

int main(void) {
    char string[] = "abcd";

    string[0] = string[1];

    printf("%s\n", string);
}

这是一个总线错误。

#include <stdio.h>

int main(void) {
    char *string = "abcd";

    string[0] = string[1];

    printf("%s\n", string);
}

为什么?

Valgrind说:

==9909== Process terminating with default action of signal 10 (SIGBUS)
==9909==  Non-existent physical address at address 0x100000FA2
==9909==    at 0x100000F65: main (test.c:6)

1 个答案:

答案 0 :(得分:0)

因为在第二种情况下,您尝试修改调用string literalundefined behavior

详细说明,在第二种情况下,string[0]是字符串文字的第一个元素,对此的任何赋值都是尝试修改该元素所持有的值。

引用C11,章节§6.4.5,“字符串文字”

  

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