C 为什么将字符串中的字符分配给自身是一个总线错误?
正如我所期望的那样,它可以工作并生成C 为什么将字符串中的字符分配给自身是一个总线错误?,c,C,正如我所期望的那样,它可以工作并生成bbcd #include <stdio.h> int main(void) { char string[] = "abcd"; string[0] = string[1]; printf("%s\n", string); } 因为在第二种情况下,您试图修改调用的 详细说明一下,在第二种情况下,string[0]是字符串文本的第一个元素,对该元素的任何赋值都是试图修改该元素所持有的值 引用第§6.4.5章“字符串文字
bbcd
#include <stdio.h>
int main(void) {
char string[] = "abcd";
string[0] = string[1];
printf("%s\n", string);
}
因为在第二种情况下,您试图修改调用的 详细说明一下,在第二种情况下,
string[0]
是字符串文本的第一个元素,对该元素的任何赋值都是试图修改该元素所持有的值
引用第§6.4.5章“字符串文字”
[…]如果程序试图修改这样的数组,则该行为为
未定义
abcd
是一个常数。你可以做charstring[5]=“abcd”请在提问前使用搜索。charstring[]=“abcd”
声明一个数组并用{a',b',c',d','\0'}
初始化它<代码>字符*string=“abcd”
声明指向字符的指针
,并使用指向常量字符串开头的指针对其进行初始化“abcd”
。您可以更改声明的数组,但修改常量字符串会导致未定义的行为。@2501会出现许多不相关的情况。谢谢你指出dup。@Paul Rooney你能给你的评论提供一些参考吗?
#include <stdio.h>
int main(void) {
char *string = "abcd";
string[0] = string[1];
printf("%s\n", string);
}
==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)