2013-06-03 14 views
11

Dlaczego to jest sizeof("Bill") jest, ale jest 1?Dlaczego rozmiar bajtów ciągu jest dłuższy niż długość?

Czy nie powinno to sprawić, że sizeof("Bill") będzie 4, ponieważ długość struny to 4 znaki (4 x 1)?

Wydaje mi się, że może to mieć coś wspólnego z "Bill" będącym tablicą znaków, ale dlaczego powoduje to zwiększenie rozmiaru bajtów?

+4

@ H2CO3 - Zgadzam się - to proste programowanie C, który jest zwykle pokrywane w ramach kilku pierwszych rozdziałów rozsądnym książki programowania w C (lub C++) –

+7

To nie jest powód, aby nie używać tego pytania jako miejsca do napisania dobrej kanonicznej odpowiedzi i mam nadzieję, że poprawi trochę internet. –

+2

@EdHeal Być może wynik głosowania na zamknięcie byłby dobrym znakiem, z którym się zgadzasz;) Całkowicie się zgadzam, to pytanie bardzo dobrze pasuje do terminu "nie pokazuje żadnego wysiłku badawczego" w FAQ. –

Odpowiedz

22

C łańcuchy są zakończone znakiem zerowym. Na końcu tego ciągu znajduje się zero bajtów. Zakładając ASCII, "Bill" wygląda to w pamięci:

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

od standardowej C sekcja 6.4.5 napisowych ustęp 7:

W fazie translacji 7 bajt lub kod wartość zero jest dołączana do każdej sekwencji znaków wielobajtowych, która wynika z literału lub literałów ciągu.

Jeśli chcesz otrzymać odpowiedź 4 dla długości, należy użyć strlen("Bill") zamiast sizeof.

Jeśli naprawdę nie chcesz zerować terminator, to też możliwe, choć prawdopodobnie nierozsądne. Ta definicja:

char bill[4] = "Bill"; 

przyniesie tablicy 4-bajtowy bill zawierający tylko znaków 'B', 'i', 'l' i 'l', nie zerowym terminator.

3

ma 0 jako znaku terminatora, więc jego B i l l 0