Skip to content

Le Funzioni di Allocazione

Oltre a malloc, la libreria standard <stdlib.h> fornisce altre funzioni di gestione della memoria utili per scenari specifici.

La funzione calloc (Contiguous Allocation) viene utilizzata per allocare memoria per un array di oggetti e inizializza automaticamente tutti i byte a zero.

// Alloca spazio per 10 interi e li inizializza tutti a 0
int *numeri = (int *)calloc(10, sizeof(int));

Spesso ci si rende conto a runtime che lo spazio precedentemente allocato è insufficiente (o eccessivo). realloc permette di ridimensionare un blocco di memoria preesistente:

// Ridimensiona l'array per contenere 20 interi
numeri = (int *)realloc(numeri, 20 * sizeof(int));

Cosa fa internamente realloc:

  1. Se c’è spazio sufficiente nel blocco corrente, lo estende e restituisce lo stesso puntatore.
  2. Altrimenti, alloca un blocco nuovo, copia i vecchi dati nel nuovo blocco, libera il blocco vecchio e restituisce il nuovo puntatore.

Guarda questo errore molto comune:

// SBAGLIATO: se realloc fallisce, 'ptr' diventa NULL e perdi l'indirizzo originale!
ptr = realloc(ptr, nuova_dimensione);

Il modo corretto è usare una variabile temporanea:

// CORRETTO:
void *tmp = realloc(ptr, nuova_dimensione);
if (tmp != NULL) {
ptr = tmp; // Tutto ok, aggiorniamo il puntatore
} else {
// Gestione dell'errore (la memoria originale in 'ptr' è ancora intatta, possiamo liberarla o terminare il programma)
free(ptr);
exit(1);
}

C11 ha introdotto aligned_alloc per specificare restrizioni di allineamento hardware stretto per l’allocazione. Esistono anche estensioni non standard ma utilissime come reallocarray (nato su OpenBSD) che include controlli per prevenire l’overflow aritmetico nel calcolo della dimensione dell’array (es. num_elements * size che eccede SIZE_MAX).

Crea un array di 3 elementi usando calloc, verifica che contengano 0, poi assegna dei valori.