C/Gestione della memoria
Wikibooks, manuali e libri di testo liberi.
Il linguaggio C, come il lettore ha avuto modo di constatare leggendo il testo, è caratterizzato dal dare al programmatore il totale controllo sullo sviluppo della sua applicazione, non mascherando niente, anche a costo di una iniziale difficoltà tutt'altro che scontata.
Pertanto, mentre in linguaggi come Python, Ruby, Java la memoria è gestita dal Garbage collector, nel C è compito del programmatore provvedere ad allocare la memoria e soprattutto a disallocarla.
Ovviamente, per comprendere i meccanismi di gestione della memoria, è necessario conoscere l'organizzazione della stessa.
Indice |
[modifica] La memoria: lo stack e lo heap
Possiamo immaginare la memoria divisa in due settori: lo stack e lo heap. Lo stack è la memoria "fissa", che non cambia nel corso dell'esecuzione del programma, al contrario la heap è una memoria "dinamica", le cui dimensione mutano durante le esecuzione dell'applicativo.
Per meglio comprendere il concetto ricorriamo ad un esempio pratico. Vogliasi creare un software per la somma di due numeri: si istanziano due variabili con le quali si gestisce il processo logico del suddetto.In questo caso noi conosciamo il numero di valori con cui dobbiamo operare: due, e pertanto creiamo due variabili. Ma si possono verificare situazioni nelle quali non si conosce a prescindere il numero dei valori con i quali il programma dovrà confrontarsi.
Questo è il caso delle liste, un array le cui dimensioni crescono e diminuiscono. Immaginiamo quindi di dover memorizzare nel nostro programma un numero n di utenti, che non conosciamo a prescindere e che può variare nel corso dell'esecuzione. Come ovviare a questa situazione?
[modifica] Le funzioni di allocazione dinamica della memoria nel C
Il C ci viene in aiuto, fornendoci tre funzioni di grande utilità: malloc , realloc e free .
[modifica] Utilizzo della funzione malloc
La funzione malloc è adoperata nel seguente modo: puntatore=(tipo_di_puntatore*)malloc(size_t grandezza_da_allocare)
Pertanto, supponendo di aver istanziato una variabile puntatore di tipo int e di voler allocare la memoria per tre variabili di tipo int è sufficiente: puntatore=(int*)malloc(sizeof(int)*3).
[modifica] Utilizzo della funzione free
[modifica] Utilizzo della funzione realloc
[modifica] Alcune note sul malloc, realloc e free