2011-09-09 15 views
6

rozważyć następujący fragment:sizeof() stosuje się do struktury i zmienna

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

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

Kod zwraca te same wartości, ale zastanawiałem się, czy sizeof() zastosowane do zmiennej jest poprawne, czy jest to tylko zbieg okoliczności?

Dzięki.

+0

Czy próbowałeś Googling "sizeof applied to variable"? Pierwsze dwa wyniki (z których jeden pochodzi ze StackOverflow) byłyby w stanie odpowiedzieć na twoje pytanie. –

+0

Tak, oba wyrażenia 'sizeof' zwracają tę samą wartość. Zauważ, że drugi nie wymaga nawiasów; 'sizeof' jest operatorem, a nie funkcją. Ale '% u' wymaga argumentu typu' unsigned int', a nie 'size_t'. Napisz: printf ("% zu% zu \ n", sizeof (struct foo), sizeof f); 'lub this:' printf ("% lu% lu \ n", (unsigned long) sizeof (struct foo) , (unsigned long) sizeof f); ". '% zu' to funkcja specyficzna dla C99; systemowy 'printf' mignt nie obsługuje tego. –

Odpowiedz

6

Obie będą miały i powinny zwrócić tę samą wartość.

Od MSDN:

sizeof Operator
Operator sizeof daje ilość pamięci w bajtach, wymaganego do przechowywania obiekt typu argumentu. Ten operator pozwala uniknąć określania rozmiarów danych zależnych od urządzenia w programach.

sizeof unary-expression 
sizeof (type-name) 
1

Jest to zgodne z oczekiwaniami, tj. Obie zwrócą tę samą wartość. Ta wartość jest obliczana podczas kompilacji.

Zwykle dobrym zwyczajem jest użycie zmiennej w sizeof, ponieważ możesz później zmienić typ, a co za tym idzie, rozmiar również może się zmienić.

0

Ogólnie zaleca się zastosowanie do zmiennej. Pozostanie wtedy poprawny, jeśli zmieni się typ zmiennej.

+0

Wadą tego sposobu jest to, że jeśli zmienisz typ zmiennej z "just struct" na "wskaźnik do struct", to sizeof (variable) stanie się 4 (lub 8 w zależności od architektury), a kompilator z przyjemnością zaakceptuje to bez wypowiadania się ostrzeżenie. – ivanzoid

5

sizeof współpracuje z typów i wyrażeń. Po zastosowaniu go do typu, () są częścią składową sizeof: sizeof(type). Po zastosowaniu go do wyrażenia () nie należy do składni sizeof: sizeof expression.

Twoja druga sizeof nie jest "zastosowana do zmiennej". Stosuje się do wyrażenia (f). To wyrażenie składa się z pojedynczej zmiennej f zamkniętej w zbędnej parze (). Można również obejść się bez tej zbędnej pary () i używać tylko sizeof f.

Po zastosowaniu do wyrażenia sizeof zwraca rozmiar wyniku wyrażenia (tj. Rozmiar typu, który ma wyrażenie). W twoim przykładzie obie aplikacje o numerze sizeof mają zagwarantowaną wartość równą tej wartości.

W rzeczywistości, dobrą praktyką programowania jest unikanie w możliwie największym stopniu sizeof(type), tj. Wolą używać sizeof expression. To sprawia, że ​​twój kod jest bardziej niezależny od typu, co zawsze jest dobre. Nazwy typów należą do deklaracji i nigdzie indziej.

Powiązane problemy