2016-11-04 53 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,「字符串文字」

[...]如果程序試圖修改這樣的陣列,該行爲是 未定義。