2011-07-19 38 views
4

我很長很長時間沒有做過任何嚴肅的C,希望能有一個快速的解釋。以下代碼在HP/UX上編譯並運行良好。它在Ubuntu上的GCC 4.3.2上沒有任何警告(即使使用gcc -Wall),但在Linux上運行時發生段錯誤。簡單的C代碼在HPUX上工作正常,但在Linux上發生段錯誤。爲什麼?

任何人都可以解釋爲什麼嗎?

#include <stdio.h> 

int main() { 
    char *people[] = { "Abigail", "Bob" }; 

    printf("First: '%s'\n", people[0]); 
    printf("Second: '%s'\n", people[1]); 

    /* this segfaults on Linux but works OK on HP/UX */ 
    people[1][0] = 'R'; 

    printf("First: '%s'\n",people[0]); 

    return(0); 
} 

回答

8

你的人數組其實是char const *people[]。文字串通常在許多系統的只讀存儲器中。你不能寫信給他們。顯然,在HP/UX上情況並非如此。

+0

D'oh。今晚我會蜷縮在我的K&R書上! – Tom

+0

@Rudy:從​​技術上講,字符串文字只是'char *',而不是'const'。儘管大多數編譯器都將它們放在只讀段中,但試圖寫入它們會導致seg錯誤。有編譯器允許這種不良行爲,並且可能會對共享字符串文字造成巨大的問題。在這種情況下,將'people'定義爲'char const *'是個好主意,當試圖寫入'people [1] [0]'時會產生編譯時警告/錯誤。 – tomlogic

+0

@tomlogic:好的,謝謝你的更正。 –

2

字符串文字處於只讀數據段。嘗試寫入他們是違反分段。

0

您不能修改字符串文字。

+1

如果內存分割允許的話,你可以做任何你喜歡的事情。 –

相關問題