我很長很長時間沒有做過任何嚴肅的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);
}
D'oh。今晚我會蜷縮在我的K&R書上! – Tom
@Rudy:從技術上講,字符串文字只是'char *',而不是'const'。儘管大多數編譯器都將它們放在只讀段中,但試圖寫入它們會導致seg錯誤。有編譯器允許這種不良行爲,並且可能會對共享字符串文字造成巨大的問題。在這種情況下,將'people'定義爲'char const *'是個好主意,當試圖寫入'people [1] [0]'時會產生編譯時警告/錯誤。 – tomlogic
@tomlogic:好的,謝謝你的更正。 –