2013-06-23 50 views
16

Ho un pezzo di codice C e non capire come funziona la funzione sizeof(...):dimensione della matrice e la dimensione del puntatore carattere carattere

#include <stdio.h> 

int main(){ 
    const char firstname[] = "bobby"; 
    const char* lastname = "eraserhead"; 
    printf("%lu\n", sizeof(firstname) + sizeof(lastname)); 
    return 0; 
} 

Nella suddetta codice sizeof (nome) è 6 e sizeof (cognome) è 8.

Ma bobby è largo 5 caratteri e eraserhead è largo 11. Mi aspetto 16.

Perché la dimensione del comportamento si comporta in modo diverso per l'array di caratteri e il puntatore al carattere?

Qualcuno può chiarire?

+5

Sia 'sizeof' che' strlen() 'danno un risultato di tipo' size_t'. Usa '% zu', non'% lu' per stampare i valori di 'size_t'. Oppure, se il tuo compilatore non supporta '% zu', converti in un tipo noto e usa il formato appropriato per quel tipo. –

risposta

23

firstname è un array char che trasporta un terminale 0 -terminatore. lastname è un puntatore. Su un sistema a 64 bit, i puntatori hanno una larghezza di 8 byte.

+0

Bene, è chiaro che OP stava cercando di scoprire la dimensione della stringa, cioè la lunghezza della stringa, e di aggiungerli entrambi, dicendo "perché non 5 + 10 = 15?", È davvero possibile ottenere la lunghezza della stringa tramite 'sizeof' o' strlen() 'è più adatto? che ne dici? – 0decimal0

+2

@PHIfounder: Come ** una "stringa" in C è rappresentata da una sequenza di caratteri terminata da un carattere ''\ 0'' **, usare' strlen() 'per ottenere la lunghezza di una" stringa ". Funziona su array di caratteri "reali", come anche su puntatori che puntano a quest'ultimo. In questo contesto non è di primaria importanza come e dove sono memorizzati i personaggi. In effetti, la variabile che contiene la stringa non deve necessariamente corrispondere alla lunghezza della "stringa". Se invece è interessato a ** la quantità di byte dichiarata da usare una variabile **, usa l'operatore 'sizeof'. – alk

+2

E il numero di byte necessari per memorizzare una stringa 's' (o indicato da' s') è 'strlen (s) + 1'. –

3

Le dimensioni del primo array corrispondono alle dimensioni di bobby\0. \0 è il carattere di terminazione, quindi è 6.

La seconda dimensione è la dimensione di un puntatore, che è 8 byte nel sistema a 64 bit. Le sue dimensioni non dipendono dalla lunghezza della stringa assegnata.

6

sizeof un array è la dimensione della matrice totale, nel caso di "bobby", è 5 caratteri e uno finali \0 che equivale 6.

sizeof un puntatore è la dimensione del puntatore, che è normalmente 4 byte in macchina a 32 bit e 8 byte in macchina a 64 bit.

2

firstname[] è terminato da null, che aggiunge 1 alla lunghezza.

sizeof(lastname) sta dando la dimensione del puntatore invece del valore effettivo.

+3

'* lastname' è un singolo' char', quindi 'sizeof * lastname' sarà sempre 1. – caf

2

firstname è un array di 6 chars, incluso il carattere di terminazione '\0' alla fine della stringa. Ecco perché sizeof firstname è 6.

lastname è un puntatore a char e avrà qualsiasi dimensione tale puntatore ha sul tuo sistema. I valori tipici sono 4 e 8. La dimensione di lastname sarà la stessa indipendentemente da ciò a cui punta (o anche se non punta a nulla).

Problemi correlati