2013-06-23 97 views
3

數組循環當我嘗試通過下面的C程序循環,我得到的錯誤:「段錯誤:11」Ç - 通過指針

#include <stdio.h> 

main() { 

int i; 

char *a[] = { 
    "hello", 
    "how are you", 
    "what is your name" 
}; 

for (i = 0; a[i][0] != '\0'; i++) { 
    printf("\n%s", a[i]); 
} 
} 

但是,當我更換測試中for循環與以下,然後我沒有得到一個錯誤,一切正常。

for (i = 0; i < 3; i++) { 
    printf("\n%s", a[i]); 
} 

我會很感激,如果有人可以給我解釋爲什麼測試a[i][0] != '\0'不起作用,什麼我應該做的,而不是。

+0

'for(i = 0; i <3; i ++){...}'::沒有前哨。 – wildplasser

+1

我認爲其他人都擁有它,但我只是在數組未定義之後添加內存。這實際上是可能的(如果你真的擁有內存之後的內存,那麼你的代碼將工作的時間是1/256倍)。它完全沒有定義。 C中的數組沒有內置大小。你必須跟你的數組並行追蹤大小,這就是你的<3檢查工作的原因。或者,sizeof,你必須跟蹤類型。當你將數組傳遞給一個函數時,它會變成一個指針,然而你失去了sizeof。 – xaxxon

回答

8

您需要缺少一個終止字符串。您的a的定義應該是

char *a[] = { 
     "hello", 
     "how are you", 
     "what is your name", 
     "" 
    }; 

沒有空字符串,您正在訪問a[3]不存在,因此,在賽格故障。

+1

你已經回答了他的問題,但我有一個問題:使用'sizeof'是一種確定終止而不需要額外字符串的方法嗎? (關於第二個想法可能是難看的指針算術) – nonsensickle

+0

謝謝。這很好。 – Ben

+1

@nonsensical:您可以使用'sizeof'運算符,但您必須使用'sizeof(a)/ sizeof(char *)'。在任何情況下,OP都會問段錯誤的原因,並且從他的問題中可以明顯看出他正試圖終止循環上的NULL字符。 – unxnut