这工作并产生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章,"字符串字面值"
[…如果程序试图修改这样的数组,行为是定义。