ProgrammazioneSviluppatore Backend C

Come funziona l'operatore sizeof nel linguaggio C e quali sono le insidie associate al suo utilizzo?

Supera i colloqui con l'assistente IA Hintsage

Risposta

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.
  • Per gli array sizeof(array) restituisce la dimensione dell'intero array, e non la dimensione di un puntatore.
  • Quando un array viene passato a una funzione, perdi le informazioni sulla sua dimensione.

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)

Domanda trabocchetto

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

Esempi di errori reali dovuti all'ignoranza delle sottigliezze dell'argomento


Storia

Nel progetto, l'allocazione di memoria per copiare una stringa veniva effettuata in questo modo: 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

Uno dei moduli utilizzava 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.