2016-11-04 44 views
-2

这是可行的,并按照我的预期生产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) 
+1

'abcd'是一个常数。你可以用'char string [5] =“abcd”;'来代替。 – 4386427

+1

请在提问之前使用搜索。 – 2501

+1

'char string [] =“abcd”;'声明一个数组并用'{'a','b','c','d','\ 0'}'初始化它。 'char * string =“abcd”;'声明一个指向'char'的指针,并用一个指向**常量字符串**'“abcd”'开始的指针来初始化它。您可以更改您声明的数组,但修改常量字符串会导致未定义的行为。 – 2016-11-04 07:49:18

回答

0

因为在第二种情况下,你想修改string literal其调用undefined behavior

详细说明,在第二种情况下,string[0]是字符串文字的第一个元素,对它的任何赋值都是尝试修改该元素的值。

引用C11,章§6.4.5,“字符串文字”

[...]如果程序试图修改这样的阵列,该行为是 未定义。