2012-06-03 58 views
2

我似乎無法弄清楚我做錯了什麼。我只是簡單地對一系列字符進行處理並嘗試打印它們。迭代遍歷給出段錯誤的字符列表

char *name[] = {"RGS", "O", "NRGY", "SIG", "BML-O", "BHI", "KSU", "ORN"}; 
void function() { 
    int i; 
    //for (i =0; i<sizeof(name)/sizeof(char); i++) { 
    for (i =0; name[i] != NULL; i++) { 
     printf ("%s \n", name[i]); 
    } 
} 

當我使用for循環在第(一註釋掉)它打印出清單,但有那個說(NULL)末兩個項目,並給出了部分故障。當我使用第二個for循環(未註釋的循環)時,它會打印所有內容,但也會導致段錯誤。

輸出:

RGS 
O 
NRGY 
SIG 
BML-O 
BHI 
KSU 
ORN 
Segmentation fault: 11 

編譯代碼(gcc ./learningC.c)時,我沒有得到任何錯誤,如果我註釋掉這個功能我沒有得到任何錯誤(這讓我想起了這個代碼區那就是問題所在)。我想知道我做錯了什麼?

回答

6

對於第一種循環風格,您需要使用sizeof(char*)而不是sizeof(char)。該陣列的元素是char*,而不是char

For循環的第二風格,你的陣列只會有一個NULL在最後,如果你把它放在那裏:

char *name[] = {"RGS", "O", "NRGY", "SIG", "BML-O", "BHI", "KSU", "ORN", NULL}; 
+0

你說,它不一定是終止與我想要的方式?但是註釋掉的for循環是基於sizeof的,它仍然具有相同的效果(seg故障)。我不明白如何正確迭代列表。 –

+1

我已經更新了我的答案,以解決第一個循環。 –

+0

它的工作!謝謝Ned。我認爲char和char *的大小是一樣的。感謝Ned! –