2013-06-03 8 views
11

Perché è che sizeof("Bill") è 5 ma sizeof(char) è 1?Perché la lunghezza del byte di una stringa è più lunga della lunghezza?

Non dovrebbe fare sì che sizeof("Bill") sia 4 poiché la lunghezza della stringa è di 4 caratteri (4 x 1)?

Credo che possa avere qualcosa a che fare con "Bill" come un array di caratteri, ma perché questo aumenta la dimensione del byte?

+4

@ H2CO3 - Sono d'accordo - questo è semplice programmazione C che di solito è coperto entro il primo paio di capitoli di un libro di programmazione ragionevole C (o C++) –

+7

Non c'è motivo per non usare questa domanda come luogo per scrivere una buona risposta canonica e, si spera, migliorare un po 'internet. –

+2

@EdHeal Forse una votazione per la chiusura sarebbe un buon segno del tuo consenso;) Sono assolutamente d'accordo, questa domanda si adatta molto bene al termine "non mostra sforzi di ricerca" nelle FAQ. –

risposta

22

Le stringhe C terminano con null. C'è un byte zero alla fine di quella stringa. Supponendo ASCII, "Bill" assomiglia a questo in memoria:

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

Dalla serie C, sezione 6.4.5 stringhe letterali, del paragrafo 7:

In fase di traduzione 7, un byte o un codice di il valore zero viene aggiunto a ogni sequenza di caratteri multibyte risultante da una stringa letterale o letterale.

Se si desidera ottenere una risposta del 4 per la lunghezza, è necessario utilizzare strlen("Bill"), piuttosto che sizeof.

Se davvero non si desidera il terminatore null, è anche possibile, anche se probabilmente mal consigliato. Questa definizione:

char bill[4] = "Bill"; 

darà un array di 4 byte bill contenente solo i caratteri 'B', 'i', 'l', e 'l', senza nullo-terminatore.

3

ha un 0 come carattere di terminazione, quindi la sua B i l l 0