prof. Nunzio Brugaletta | Programmazione e linguaggio C |
Non sempre è nota a priori la dimensione di una struttura e quindi non è sempre possibile utilizzare una struttura sequenziale che richiede la conoscenza di tale dimensione per poter allocare spazio in memoria. In questi casi viene utilizzata la struttura concatenata: si alloca spazio in memoria quando serve e tutto quello che serve, compatibilmente ovviamente con le risorse disponibili, e si collegano gli elementi fra di loro tramite puntatori, in modo che ogni elemento fornisca informazioni su dove trovare in memoria il successivo della lista.
Ora si esamineranno gli strumenti che mette a disposizione il linguaggio C per l’allocazione dinamica della memoria, in seguito si vedranno le funzioni principali per la gestione di una struttura concatenata.
sizeof. La funzione restituisce il numero di byte che occorrono per conservare un dato del tipo di quello specificato come argomento della funzione. Come argomento della funzione si può specificare un tipo o anche una espressione:
... typedef struct rec { char titolo[50]; char autore[20]; char editore[20]; float prezzo; }libro; ... int nbyte1,nbyte2; ... nbyte1 = sizeof(int); nbyte2 = sizeof(libro); ...
In questo caso la variabile nbyte1 conterrà il numero di byte occorrenti per conservare in memoria un dato di tipo int e nbyte2 il numero di byte occorrenti per conservare in memoria un dato di tipo libro.
Le altre due funzioni trattate di seguito richiedono l’inclusione, nel programma che intende utilizzarle, di un nuovo header. Occorre specificare: #include <stdlib.h>.
malloc. La funzione alloca una zona di memoria atta a contenere un dato tipo e restituisce un puntatore a tale zona di memoria. Come argomento la funzione richiede di conoscere il numero di byte da allocare.
Qualora non fosse disponibile la quantità di memoria richiesta, la funzione restituisce nel puntatore il valore NULL (puntatore nullo: costante simbolica definita in stdlib.h utilizzata come valore da attribuire ad un puntatore di fine lista o come inizializzazione di un puntatore).
... typedef struct rec { char titolo[50]; char autore[20]; char editore[20]; float prezzo; }libro; ... libro *p1; /*1*/ ... p1 = (libro *) malloc(sizeof(libro)); /*2*/ ...
Nella 1 è dichiarato un puntatore alla struttura libro.
Nella 2 si richiede di allocare una zona di memoria tale da contenere una struttura di tipo libro; mediante un casting, il puntatore ritornato viene trasformato in puntatore alla struttura libro.
free. La funzione rilascia una zona di memoria prima allocata, per esempio, con una chiamata alla funzione malloc. La funzione richiede di conoscere, come parametro, il puntatore alla zona di memoria che si vuol liberare.
È opportuno notare la necessità dell’utilizzo di tale funzione. La memoria centrale è una risorsa limitata e quindi non è opportuno tenere allocata, per elementi che non sono più di interesse, memoria che può essere utilizzata per conservare dati ancora utili per l’elaborazione da svolgere.
La chiamata: free(p1); libera la memoria allocata nell’esempio precedente.
http://ennebi.solira.org | ennebi@solira.org |