为什么将字符串中的字符赋值给自身是总线错误?



这工作并产生bbcd,正如我所期望的。

#include <stdio.h>
int main(void) {
    char string[] = "abcd";
    string[0] = string[1];
    printf("%sn", string);
}

总线错误。

#include <stdio.h>
int main(void) {
    char *string = "abcd";
    string[0] = string[1];
    printf("%sn", 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)

因为在第二种情况下,您试图修改调用未定义行为的字符串文字。

更详细地说,在第二种情况下,string[0]是字符串字面值的第一个元素,对它的任何赋值都是试图修改该元素保存的值。

引用C11,第6.4.5章,"字符串字面值"

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

最新更新