这可以工作并产生 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)
最佳答案
因为在第二种情况下,您试图修改 string literal它调用 undefined behavior .
详细来说,在第二种情况下,string[0]
是字符串文字的第一个元素,对其进行任何赋值都是试图修改该元素所保存的值。
引用 C11
,第 §6.4.5 章,“字符串文字”
[...] If the program attempts to modify such an array, the behavior is undefined.
关于c - 为什么将字符串中的字符分配给自身会导致总线错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40417574/