2012-01-04 10 views
6

La Struttura è definito come segueCome funziona la funzione sizeof() per Structures in C?

typedef struct Sample 
{ 
    int test; 
    char strtest; 
} Sample; 

In Funzione principale, ho chiamato Sizeof la struttura.

sizeof(struct Sample) 

Ho sentito che il valore restituito di sizeof su strutture potrebbe essere errato. Se questo è il caso, cosa dovrei fare per ottenere il giusto valore?

+1

Con un typedef in ambito 'Sample' non è un tipo valido. Stai usando un compilatore C++ per il codice C? Suggerisco di non farlo ... e se 'Sample' è un oggetto le parentesi sono ridondanti. – pmg

+0

sizeof non è una funzione, ma una direttiva del compilatore. Significa che non viene eseguito in runtime, ma viene sostituito con il valore corrispondente in fase di compilazione. – Rolice

+0

Non è mai "errato". Manca solo la tua comprensione, non il compilatore. –

risposta

22

Restituisce un valore affidabile, non sempre il valore che ci si aspetta.

Nella struttura di esempio, si presuppone un byte di 1 byte e 4 byte di int, ma non si ottiene un risultato di "5".

Poiché la struttura è imbottita in modo che gli elementi inizino sui loro confini naturali. è più probabile che tu ottenga un risultato di "8".

Wiki spiega questo piuttosto bene: http://en.wikipedia.org/wiki/Sizeof - in "Struttura Padding", nella parte inferiore.

+0

@ Karthik: è indipendente dalla piattaforma? – Karai

+0

No, non è indipendente dalla piattaforma; non è nemmeno necessariamente * compilatore * indipendente. –

+0

@ Ernest: puoi spiegare i tuoi pensieri – Karai

1

Sizeof non è una funzione; è un operatore . Il risultato è sempre corretto, ma a volte inaspettato, a causa del riempimento, o la convinzione che si tratti di un determinatore di dimensioni di matrice magiche.

Come operatore, le parentesi non sono necessarie se si agisce in una variabile.

int foo; 
printf("%zu\n", sizeof foo); 

è perfettamente legale.

+0

dovresti usare '% zu' con' sizeof', la specifica di conversione '% d' con' sizeof' non è definita – ouah

1

sizeof con un tipo di struttura funziona come con qualsiasi altro tipo: il risultato dell'operatore è la dimensione del tipo in byte. La dimensione del tipo di struttura è uguale alla dimensione di un oggetto di questo tipo di struttura.

sizeof un oggetto struttura può essere più della dimensione dei diversi elementi dei tipi di struttura a causa del riempimento.

Ci possono essere imbottitura del numero imprecisato di byte dopo ogni membro della struttura e l'imbottitura è tenuto conto delle dimensioni del tipo di struttura (o di un oggetto del tipo di struttura)

Per stampare le dimensioni di un tipo di struttura utilizzare l'identificatore z di conversione in una stringa di formato printf:

printf("%zu\n", sizeof (struct my_structure_type));