2013-06-03 544 views
11

爲什麼sizeof("Bill")5但是sizeof(char)1爲什麼字符串的字節長度比長度長?

不應該認爲sizeof("Bill")4,因爲字符串的長度是4個字符(4 x 1)?

我認爲它可能與"Bill"是一個字符數組有關,但爲什麼這會增加字節大小?

+4

@ H2CO3 - 我同意 - 這是通常覆蓋在C(或C的第一對夫婦一個合理編程的書的章節中簡單的C++編程) –

+7

這是沒有理由不把這個問題作爲一個地方寫一個良好的規範的答案,並希望改善互聯網一點點。 –

+2

@EdHeal也許結束辯論的投票將是你贊同的一個好兆頭;)我完全同意,這個問題非常適合的「顯示沒有研究工作」中的常見問題項。 – 2013-06-03 21:19:29

回答

22

C字符串以null結尾。該字符串的末尾有一個零字節。假設ASCII,"Bill"看起來像這樣在存儲器中:

'B' 'i' 'l' 'l' '\0' 
0x42 0x69 0x6c 0x6c 0x00 

從C標準,第6.4.5 字符串文字,第7段:

在翻譯階段7,字節或代碼數值零附加到由一個或多個字符串產生的每個多字節字符序列。

如果你想獲得長度4一個答案,你應該使用strlen("Bill"),而不是sizeof

如果你真的不想要null終結者,那也可能,儘管可能不太明智。這樣的定義:

char bill[4] = "Bill"; 

將產生僅包含字符的4個字節的數組bill'B''i''l',並'l',沒有空終止符。

3

它有一個0作爲一個終止符,所以其B i l l 0