AD

Modificare spazio allocato in memoria con la realloc in C

Una volta allocato dinamicamente dello spazio in memoria usando le funzioni malloc e calloc, come visto nelle pagine precedenti, in C è anche presente la funzione realloc, la quale permette di modificare le dimensioni delle aree di memoria precedentemente allocate. Come le due funzioni precedenti, anche le realloc è inclusa nella libreria stdlib.h e possiede la seguente sintassi:

void realloc(void ptr, size_t size);

dove ptr è il puntatore al blocco di memoria precedentemente allocato con la funzione malloc, calloc o di una precedente realloc, ed indica lo spazio di memoria da modificare. In particolare, se il puntatore ptr è nullo, allora la realloc alloca un nuovo spazio di memoria.

Mentre il parametro size indica la nuova dimensione in byte dello spazio di memoria, nello specifico, se viene passato il valore 0 ed il puntatore ptr punta ad uno spazio di memoria precedentemente allocato, il blocco di memoria verrà deallocato e la funzione restituirà un puntatore a NULL.

Inoltre la funzione realloc restituisce, in caso di successo, il puntatore al nuovo blocco di memoria, mentre in caso di errore restituisce NULL.

Nota: se con la realloc si modifica uno spazio di memoria precedentemente allocato aggiungendo ulteriore spazio, i dati precedenti non verranno alterati, mentre nel caso contrario, in cui la dimensione del blocco di memoria viene ridotto, una parte (o tutti) dei dati sarà eliminata.

Esempio di utilizzo della funzione realloc in C

Di seguito viene riportato un esempio di utilizzo della funzione realloc in C, in particolare, durante la sua esecuzione, il programma alloca dinamicamente dello spazio in memoria, usando la funzione malloc, per un array di 10 interi (dimensione indicata dalla variabile dim) ed inserisce al suo interno valori che vanno da 0 a 9, in ordine crescente.

Successivamente il programma usa la realloc per modificare lo spazio di memoria, riducendolo da 10 a 6 interi. Questo significa che l’array di partenza non avrà più 10 valori, ma solamente 6, infatti andando a stampare il suo contenuto, vediamo che si ferma al valore 5.

#include <stdio.h> #include <stdlib.h> int main(){     int *a, dim;     dim = 10;     // Allocchiamo uno spazio di memoria per 10 interi     a = malloc(sizeof(int) * dim);     // Riempiamo l'array con valori da 0 a 9     for(int i=0; i<dim; i++){         a[i] = i;         printf("%d ", a[i]);     }     printf("\n");     // Modifichiamo lo spazio di memoria precedentemente alloccato     dim = 6;     a = realloc(a, sizeof(int) * dim);     for(int i=0; i<dim; i++){         printf("%d ", a[i]);     }     return 0; } /* Output: 0 1 2 3 4 5 6 7 8 9  0 1 2 3 4 5 */