ProgrammatieBackend C ontwikkelaar

Hoe werkt de operator sizeof in de programmeertaal C, en welke valkuilen zijn er bij het gebruik ervan?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

De operator sizeof wordt gebruikt om de grootte van een type of object in bytes te bepalen tijdens de compilatiefase. Het is vaak nodig voor het toewijzen van geheugen, het berekenen van de groottes van structuren en arrays.

Voorbeeld:

int a; printf("%zu\n", sizeof(a)); // grootte van de variabele a van het type int printf("%zu\n", sizeof(int)); // grootte van het type int

Kenmerken:

  • sizeof retourneert size_t, altijd >= 0.
  • Voor arrays retourneert sizeof(array) de grootte van de hele array, niet de grootte van de pointer.
  • Bij het doorgeven van een array aan een functie verlies je informatie over de grootte ervan.

Voorbeeld van een valkuil:

void foo(int arr[]) { printf("%zu\n", sizeof(arr)); // geeft de grootte van de pointer terug, niet van de array! } int arr[10]; foo(arr); // sizeof(arr) == 40 (gewoonlijk), sizeof(arr op het niveau van foo) == 8 (gewoonlijk)

Vraag met een valstrik

Wat zal de expressie sizeof('a') in de programmeertaal C retourneren?

Antwoord: Ondanks dat 'a' eruitziet als char, is het resultaat van de expressie sizeof('a') gelijk aan de grootte van het type int, omdat een karakterconstante in C een int is.

Voorbeeld:

sizeof('a') // gewoonlijk 4, niet 1

Voorbeelden van werkelijke fouten door gebrek aan kennis van de nuances van het onderwerp


Verhaal

In het project werd geheugen toegewezen om een string te kopiëren als volgt: malloc(strlen(str) * sizeof(char)), waarbij de nul-terminator werd vergeten. Dit leidde tot het verlies van de laatste byte en veroorzaakte bugs bij het werken met functies van de standaardbibliotheek voor het verwerken van strings.

Verhaal

Een van de modules gebruikte sizeof(arr) in een functie, verwachtend de grootte van de hele structuur, maar ontving alleen de grootte van de pointer. Als gevolg hiervan werd er te weinig gegevens in het geheugen geschreven, wat leidde tot schade aan de heap.

Verhaal

Een ontwikkelaar besloot sizeof('a') te gebruiken om geheugen toe te wijzen voor één letter, verwachtend 1 byte te krijgen, maar kreeg 4 (of 8) — dit resulteerde in een inefficiënte geheugengebruik en problemen in de code die afhankelijk was van de verwachte grootte.