2011-09-09 17 views
6

consideri il seguente frammento:sizeof() applicato a struttura e variabile

struct foo { 
    int a; 
    int b; 
    int c; 
}; 

struct foo f; 
printf("%u, %u\n", sizeof(struct foo), sizeof(f)); 

Il codice restituisce gli stessi valori, ma mi chiedevo se sizeof() applicato alla variabile è corretto o questo è solo una coincidenza?

Grazie.

+0

Hai provato a cercare su Google "sizeof applicato a variabile"? I primi due risultati (uno dei quali è di StackOverflow) sarebbero stati in grado di rispondere alla tua domanda. –

+0

Sì, entrambe le espressioni 'sizeof' restituiscono lo stesso valore. Si noti che il secondo non richiede parentesi; 'sizeof' è un operatore, non una funzione. Ma '% u' richiede un argomento di tipo' unsigned int', non 'size_t'. Scrivi questo: 'printf ("% zu% zu \ n ", sizeof (struct foo), sizeof f);' oppure this: 'printf ("% lu% lu \ n ", (unsigned long) sizeof (struct foo) , (unsigned long) sizeof f); '. '% zu' è una funzionalità specifica per C99; il 'printf' mignt del tuo sistema non lo supporta. –

risposta

6

Entrambi restituiranno lo stesso valore.

Da MSDN:

Il sizeof operatore
L'operatore sizeof dà la quantità di memoria, in byte, necessaria per memorizzare un oggetto del tipo dell'operando. Questo operatore consente di evitare di specificare le dimensioni dei dati dipendenti dalla macchina nei programmi.

sizeof unary-expression 
sizeof (type-name) 
1

Questo è come previsto, vale a dire entrambi restituiscono lo stesso valore. Questo valore è calcolato al momento della compilazione.

In genere, è buona norma utilizzare la variabile in sizeof in quanto è possibile modificare il tipo in modo da modificare anche la dimensione.

0

In generale è preferibile applicarlo alla variabile. Rimarrà quindi corretto se il tipo di variabile cambia.

+0

Lo svantaggio di questo modo è che se si modifica il tipo di variabile da "just struct" a "pointer to struct", quindi sizeof (variabile) diventerà 4 (o 8 a seconda dell'architettura) e il compilatore lo accetterà volentieri senza dirti nulla avvertimento. – ivanzoid

5

sizeof opere con tipi e espressioni. Quando lo si applica a un tipo, lo () fa parte della sintassi sizeof: sizeof(type). Quando lo si applica a un'espressione () non fanno parte della sintassi sizeof: sizeof expression.

Quindi il tuo secondo sizeof non è realmente "applicato a una variabile". Si applica a un'espressione (f). Tale espressione consiste in una singola variabile f racchiusa in una coppia ridondante di (). Puoi anche fare a meno di quella coppia ridondante di () e usare solo sizeof f.

Quando sizeof viene applicato a un'espressione, restituisce la dimensione del risultato dell'espressione (ovvero la dimensione del tipo di espressione). Nel tuo esempio, entrambe le applicazioni di sizeof sono valutate allo stesso valore.

In effetti, una buona pratica di programmazione è quella di evitare il più possibile sizeof(type), cioè preferisce usare sizeof expression. Questo rende il tuo codice più indipendente dal tipo, che è sempre una buona cosa. I nomi dei tipi appartengono alle dichiarazioni e da nessun'altra parte.

Problemi correlati