这可以产生并产生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)
答案 0 :(得分:0)
因为在第二种情况下,您尝试修改调用string literal的undefined behavior。
详细说明,在第二种情况下,string[0]
是字符串文字的第一个元素,对此的任何赋值都是尝试修改该元素所持有的值。
引用C11
,章节§6.4.5,“字符串文字”
[...]如果程序试图修改这样的数组,行为是 未定义。