programowanieBackend C deweloper

Jak działa operator sizeof w języku C i jakie pułapki istnieją przy jego użyciu?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

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.
  • Dla tablic sizeof(array) zwraca rozmiar całej tablicy, a nie rozmiar wskaźnika.
  • Przekazując tablicę do funkcji, tracisz informacje na jej temat o rozmiarze.

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)

Pytanie z pułapką

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

Przykłady rzeczywistych błędów z powodu braku znajomości niuansów tematu


Historia

W projekcie alokowano pamięć na kopiowanie ciągu w ten sposób: 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

Jeden z modułów używał 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.