Operator sizeof służy do określenia rozmiaru typu lub obiektu w bajtach na etapie kompilacji. Często jest potrzebny do alokacji pamięci, obliczania rozmiarów struktur i tablic.
Przykład:
int a; printf("%zu ", sizeof(a)); // rozmiar zmiennej a typu int printf("%zu ", sizeof(int)); // rozmiar typu int
Cechy:
sizeof zwraca size_t, zawsze >= 0.sizeof(array) zwraca rozmiar całej tablicy, a nie rozmiar wskaźnika.Przykład pułapki:
void foo(int arr[]) { printf("%zu ", sizeof(arr)); // wyświetli rozmiar wskaźnika, a nie tablicy! } int arr[10]; foo(arr); // sizeof(arr) == 40 (zazwyczaj), sizeof(arr na poziomie foo) == 8 (zazwyczaj)
Co zwróci wyrażenie sizeof('a') w języku C?
Odpowiedź: Mimo że 'a' wygląda jak char, w wyrażeniu sizeof('a') wynik jest równy rozmiarowi typu int, ponieważ stała znakowa w C to int.
Przykład:
sizeof('a') // zazwyczaj 4, a nie 1
Historia
malloc(strlen(str) * sizeof(char)), zapominając o znaku null. To doprowadziło do utraty ostatniego bajtu i pojawienia się błędów przy pracy z funkcjami standardowej biblioteki przetwarzania ciągów.Historia
sizeof(arr) w funkcji, oczekując rozmiaru całej struktury, ale otrzymał tylko rozmiar wskaźnika. W rezultacie do pamięci zapisywano zbyt mało danych, co powodowało uszkodzenie sterty.Historia
Programista postanowił użyć sizeof('a') do alokacji pamięci na jedną literę, oczekując 1 bajtu, a otrzymał 4 (lub 8) – doprowadziło to do nieefektywnego wykorzystania pamięci i problemów w kodzie, zależnym od oczekiwanego rozmiaru.