2012-01-04 16 views
6

struktura jest zdefiniowana w następujący sposóbJak działa funkcja sizeof() dla struktur w C?

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

W głównej funkcji, zadzwoniłem sizeof struktury.

sizeof(struct Sample) 

Słyszałem, że zwracana wartość sizeof na strukturach może być niepoprawna. Jeśli tak, to co powinienem zrobić, aby uzyskać odpowiednią wartość?

+1

z out a typedef w zakresie "Sample" nie jest poprawnym typem. Czy używasz kompilatora C++ dla kodu C? Sugeruję, że tego nie robisz ... a jeśli 'Sample' jest obiektem, nawias jest zbędny. – pmg

+0

sizeof nie jest funkcją, ale dyrektywą kompilującą. Oznacza to, że nie jest to wykonywane środowisko wykonawcze, ale zostało zastąpione odpowiednią wartością podczas kompilacji. – Rolice

+0

To nigdy nie jest "nieprawidłowe". Brakuje tylko twojego zrozumienia, a nie kompilatora. –

Odpowiedz

22

Zwraca niezawodną wartość - nie zawsze jest to wartość, której się spodziewasz.

W strukturze Sample przyjmujesz wartość 1-bajtową i 4-bajtową int, ale nie otrzymujesz wyniku "5".

Ponieważ struktura jest wyściełana, aby elementy zaczynały się na swoich naturalnych granicach. masz większe szanse na uzyskanie wyniku "8".

Wiki wyjaśnia to całkiem dobrze: http://en.wikipedia.org/wiki/Sizeof - w "Uzupełnieniu struktury", u dołu.

+0

@ Karthik: Czy jest niezależny od platformy? – Karai

+0

Nie, nie jest niezależny od platformy; to niekoniecznie * kompilator * niezależny. –

+0

@ Ernest: możesz wyjaśnić swoje myśli – Karai

1

Rozmiar nie jest funkcją; jest to operator . Wynik jest zawsze poprawny, ale czasami nieoczekiwany, z powodu dopełnienia lub przekonania, że ​​jest to magiczny wyznacznik rozmiaru tablicy.

Jako operator nawiasy nie są potrzebne, jeśli działają w zmiennej.

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

jest całkowicie legalny.

+0

powinieneś użyć '% zu' z' sizeof', '% d' specyfikacji konwersji z' sizeof' jest niezdefiniowane – ouah

1

sizeof z typem konstrukcji działa tak, jak każdym innym typem: wynikiem operatora jest rozmiar typu w bajtach. Rozmiar typu struktury jest taki sam jak rozmiar obiektu tego typu konstrukcji.

Obiekt konstrukcji może być większy niż rozmiar różnych elementów konstrukcji z powodu wypełnienia.

Nie może być wyściółka numeru nieokreślonym bajtów po każdym elementem konstrukcji i wyściółka jest uwzględniona w wielkości typu konstrukcji (lub obiektu typu konstrukcji)

Aby wydrukować rozmiar typ struktury użyć specyfikatora z konwersji w ciągu formatu printf:

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