c - 为什么将字符串中的字符分配给自身会导致总线错误?

标签 c

这可以工作并产生 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/

相关文章:

c - 当变量从数组末尾更改时,gdb 观察点将不起作用

c - Windows 控制台 API

c - 菜单功能错误: comparison between pointer and integer [enabled by default]

c - 帮助基本线程概念/竞争条件

c - Websphere MQ - 多个消费者的主题订阅

c - 对可变参数宏中的所有参数进行类型转换

c - UART pic18 到 pic18

处理 char 数组时处理 NULL char 的正确方法

c - 将命令行参数传递给子进程并计算它们

c - 消除目录命令行参数中的空格