L'operatore sizeof viene utilizzato per determinare la dimensione di un tipo o di un oggetto in byte durante la fase di compilazione. È spesso necessario per l'allocazione di memoria, il calcolo delle dimensioni di strutture e array.
Esempio:
int a; printf("%zu ", sizeof(a)); // dimensione della variabile a di tipo int printf("%zu ", sizeof(int)); // dimensione del tipo int
Caratteristiche:
sizeof restituisce size_t, sempre >= 0.sizeof(array) restituisce la dimensione dell'intero array, e non la dimensione di un puntatore.Esempio di insidia:
void foo(int arr[]) { printf("%zu ", sizeof(arr)); // restituirà la dimensione del puntatore, non dell'array! } int arr[10]; foo(arr); // sizeof(arr) == 40 (solitamente), sizeof(arr a livello di foo) == 8 (solitamente)
Cosa restituirà l'espressione sizeof('a') nel linguaggio C?
Risposta: Anche se 'a' appare come char, nell'espressione sizeof('a') il risultato è pari alla dimensione del tipo int, poiché una costante carattere in C è int.
Esempio:
sizeof('a') // solitamente 4, e non 1
Storia
malloc(strlen(str) * sizeof(char)), dimenticando il carattere nullo. Ciò ha portato alla perdita dell'ultimo byte e ha causato bug durante l'utilizzo delle funzioni della libreria standard per la gestione delle stringhe.Storia
sizeof(arr) nella funzione, aspettandosi la dimensione dell'intera struttura, ma ricevendo solo la dimensione del puntatore. Di conseguenza, venivano scritti troppi pochi dati in memoria, causando la corruzione dell'heap.Storia
Uno sviluppatore ha deciso di usare sizeof('a') per allocare memoria per una singola lettera, aspettandosi 1 byte, ma ha ottenuto 4 (o 8) — questo si è tradotto in un consumo inefficiente di memoria e problemi nel codice dipendente dalla dimensione prevista.