2012-11-30 90 views
2

我現在正在學習c,並且對char字符串數組元素的大小元素略有困惑。字符串數組元素的大小是多少?

拿這個例子:

char *states[] = { 
    "California", "Oregon", 
    NULL, "Texas" 
}; 

我想看看我怎麼能得到數組的大小,所以我可以通過它的計數循環。我發現一些網站上的這個計算得到數組的大小:

int size = sizeof(states)/sizeof(states[0]); 

我有點困惑,爲什麼sizeof(states[0]) 8個字節?

回答

3

你有一個指向字符的指針數組。陣列的總大小爲

<number of elements> * <number of bytes for a char pointer> 

其中一個成員的大小是char指針的大小(系統上是8個字節)。所以,給你:4*sizeof(char *)/sizeof(char *)因此數組中的元素的數量。

要查看該字符串的長度位置0您需要:

strlen(states[0]); 

,這將給你你期待的10。

+0

哦,對,我現在看。非常感謝解釋,非常有幫助。 –

1

char *states[]是一組字符指針。所以sizeof任何元素的數組將會給你一個指針的大小,在你的情況恰好是8個字節。

1

這是架構從屬行爲。 sizeof(states[0])是一個字符指針的大小,因爲states[0]是一個字符指針。在你的機器大小char指針碰巧是8。因此輸出。

如果你真的想要字符串的大小,那麼最好使用states[0]上的strnlen()

+0

另外請注意,我建議使用'strnlen()'而不是'strlen()',因爲strnlen()提供了更安全的解決方案。 – CCoder

+2

strnlen如何更安全?如果字符串格式不正確或者指針不好或者給你一個正確的結果,strlen將會安全地崩潰。如果字符串格式錯誤或指針不正確,strnlen會崩潰,給你一個正確的結果或給你一個截斷的結果。如何添加可能被截斷的錯誤結果會使安全性更高? – Art

+0

@Art我的觀點是,如果你沒有得到NULL結尾的字符串,你不會以無限循環結束。很容易傳遞一個沒有正確NULL終止的字符串。在scanf中的示例,您最終可能會讀取一個沒有NULL終止的字符串。而不是崩潰有一個截斷的字符串更好。 – CCoder

1
I'm a little confused, why is sizeof(states[0]) 8 bytes? 

因爲states是一個char指針數組。

因此,states[0]是數組的第一個元素,在您的機器上我認爲地址是8個字節。

這就是爲什麼你越來越8