In questa lezione studieremo la funzione realloc in C, per modificare le aree precedentemente allocate anche in una fase successiva.
Abbiamo già studiato infatti le funzioni malloc e calloc che permettono di allocare la memoria dinamicamente.
Il prototipo di realloc è:
void *realloc(void *, size_t);
Dove, il primo argomento rappresenta il puntatore all’inizio dell’area di memoria che si vuole dimensionare, mentre il secondo indica la nuova dimensione da assegnare al blocco di memoria.
Se il nuovo blocco di memoria è più grande di quello precedente allora i dati rimarranno inalterati, in caso contrario invece i dati saranno eliminati.
Anche in questo caso il valore di ritorno è di tipo void, quindi per far si che punti a tipi diversi occorre effettuare un’operazione di cast, così come abbiamo già visto per malloc e calloc.
La funzione realloc si può anche chiamare più volte sullo stesso puntatore.
Inoltre ricordiamo che se il puntatore è NULL si comporta allo stesso modo di malloc().
Esempio di utilizzo di realloc
Innanzitutto utilizziamo malloc per allocare un array di 10 interi, ma quando assegniamo a[10]=13; o ad esempio a[18]=-120; stiamo commento un errore. Occorre infatti fare la riallocazione utilizzando la funzione realloc.
#include <stdio.h>
#include <stdlib.h>
int main () {
int *a;
/*allochiamo un array di 10 interi*/
a=malloc(10*sizeof(int));
if(a==NULL) {
printf("\nAllocazione fallita!");
exit(0);
}
/*allocazioni corrette*/
a[2]=-5;
a[7]=22;
/*allocazioni non corrette perchè sono fuori dalla zona assegnata con la malloc*/
a[10]=13;
a[18]=-120;
/* occorre prima fare una riallocazione se vogliamo ad esempio contenere 20 interi*/
a=realloc(a, 20*sizeof(int));
/*adesso si può arrivare sino ad a[19]*/
a[10]=13;
a[18]=-120;
printf("a[2]=%d a[7]=%d a[10]=%d a[18]=%d\n", a[2], a[7], a[10], a[18]);
return 0;
}
Chiaramente questo è solo un semplice esempio di utilizzo della funzione realloc in C, più avanti faremo altri esempi.
Alcuni link utili
Realizzare un menù di scelta in C
Somma elementi diagonale principale di una matrice
Come sommare gli elementi della cornice esterna
Sommare dei numeri di una matrice
Ricerca elementi in una matrice