2013-01-20 67 views
2

可能重複:
Why does this Seg Fault?
What is the difference between char a[] = 「string」; and char *p = 「string」;爲什麼這是錯的?

試圖瞭解爲什麼S [0] = 'H' 會失敗。我猜這與處理內存中的數據段有關,但也許有人更好地解釋這一點?

void str2 (void) 
{ 
    char *s = "hello"; 
    printf("%s\n", s); 
    s[0] = 'H';   //maybe this is a problem because content in s is constant? 
    printf("%s\n", s); 
} 

int main() 
{ 
    str2(); 
    return 0; 
} 
+0

歡迎來到SO。除了重複之外,你的問題標題對於澄清你的內容也沒有多大幫助。 –

+0

什麼是無意義的問題名稱! – onmyway133

回答

6

因爲C標準說,試圖修改字符串字面給人不確定的行爲,這是錯誤。

究竟會發生什麼可以和將會有所不同。在某些情況下,它會「工作」 - 字符串文字的內容將改變爲你所問的內容(例如,回到MS-DOS的日子裏,它通常會這樣做)。在其他情況下,編譯器將合併相同的字符串常量,所以像:

char *a = "1234"; 
char *b = "1234"; 

a[1] = 'a'; 

printf("%s\n", b); 

...將打印出1a34,即使你從來沒有明確修改b可言。

在其他情況下(包括大多數現代系統),您可能會發現嘗試的寫入完全失敗,並且會拋出某種異常/信號。

+0

謝謝傑瑞。我在Windows上運行這個,我得到了一個「應用程序崩潰」的消息。 – DriverDev

0

我認爲這種行爲,一個好的或嚴厲的編譯器不應該允許,因爲這是(char * s =「hello」)指向常量,即修改內容將導致未定義的行爲,如果編譯器不會拋出任何錯誤這個