2013-01-05 40 views
0

可能重複:
Why do I get a segmentation fault when writing to a string?
Why do I get a segmentation fault when I try to modify a string constant?分段故障而使用char *的字符串,但不能用字符串[11]

我試圖運行下面的兩個代碼和我我得到一個段錯誤file2.c file1.c我沒有得到任何過錯。有人可以解釋什麼是下面的代碼之間的區別:

file1.c中

#include <stdio.h> 

int main() 
{ 
    int i; 
    char string[11] = {"HelloThere"}; 
    string[10] = '\0'; 
    for(i =0;i<5;i++) 
    { 
     string[i] = 'a'; 
    } 
    printf("%s\n",string); 
} 

和:

file2.c中

#include <stdio.h> 

int main() 
{ 
    int i; 
    char * string; 
    string = "HelloThere"; 

    for(i =0;i<5;i++) 
    { 
     string[i] = 'a';  
    } 
    printf("%s",string); 

} 
+2

這個問題重複了數百次。 –

+2

@Oli - 我認爲這個更好:[爲什麼在寫入字符串時出現分段錯誤?](http://stackoverflow.com/questions/164194/why-do-i-get-a-segmentation當寫入字符串時發生錯誤)或許最好的問題是「爲什麼OP沒有打擾到先搜索?」 –

回答

3

這是因爲分配

char string[11] = {"HelloThere"}; 

副本字符串常量到一個可寫的內存,而

char * string = "HelloThere"; 

離開它的只讀存儲器。雖然寫入可寫內存(duh!)是絕對可行的,但只讀內存的寫入是未定義的行爲,並可能觸發崩潰。

注意你,除非你想比需要爲你的字符串字面量分配更多的內存並不需要顯式指定字符串的大小,:

char string[] = {"HelloThere"}; // <<== The size is empty 
1
string = "HelloThere"; 

然後

string[i] = 'a'; 

是錯誤的 - 你試圖修改一個字符串,你不能。這會導致未定義的行爲,所以會發生任何事情,包括崩潰。

然而,

char sring[11] = "HelloThere"; 

創建一個自動陣列(複製字符串的內容在它beforehands),這就是可寫的,它允許修改它們的元素。