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.sizeof(array) de grootte van de hele array, niet de grootte van de pointer.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)
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
Verhaal
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
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.