Newsgroup: it.comp.lang.c
Titolo: [Q]Memoria dinamica e variabili...

Non ho capito una cosuccia sulla allocazione/deallocazione della memoria...
se io dichiaro una funzione, e in questa funzione inizializzo una variabile,
alla fine questa variabile la devo deallocare io o no? in c è sempre
necessario deallocare manualmente la memoria, o ci sono casi in cui il
compilatore fa da se?
Raffaele

 deallocare io o no?
Se e` una variabile automatica no. Se l'hai allocata tu dinamicamente
allora si`:
void foo(iny n) {
        int i[5];
        int *j;
        j = malloc(n * sizeof(int));
        free(j);
}
In questo esempio la variabile  'i' e` automatica (auto). Il compilatore
ne conosce esattamente la dimensione e  si occupa di riservare lo spazio
per essa all'entrata della funzione e liberarla all'uscita.
La variabile 'j' e` un puntatore,  che viene inizializzato con il valore
restituito da  malloc(). malloc() si  occupa di riservare uno  spazio di
memoria  grande almeno  quanto indicato. In  questo caso  il compilatore
non  puo`  sapere  a  priori  quanta memoria  verra`  richiesta  ne  per
quanto  tempo questa  memoria verra`  utilizzata [1]  e quindi  non puo`
gestirla autonomamente. La responsabilita` della gestione di queste aree
(allocate dinamicamente) viene lasciata interamente al programmatore.
[1]
int *foo(int n) {
        int *p;
        p = malloc(n * sizeof(int));
        return p;
}
La vita di una variabile e`  limitata al blocco in cui e` dichiarata. Il
compilatore  sa  che   alla  fine  di  quel  blocco   puo`  liberare  la
memoria  occupata  senza   rischi. Nell'esempio  il  puntatore  all'area
riservata  con  malloc   viene  usato  come  valore   di  ritorno  dalla
funzione e  (presumibilmente) divetera` accessibile anche  nel resto del
programma. Posso  fare  riferimento  a  questa  zona  di  memoria  anche
all'esterno del blocco in cui e` stata allocata.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"I've seen things you people wouldn't believe...
 Attack Ships on fire off the shores of Orion.
 I've watched C-beams glitter in the dark off of Tanhauser Gate.
 All those moments will be lost in time...like tears, in rain.
 Time to die." -- Roy Batty (played by Rutger Hauer)

 compilatore fa da se?
Il compilatore non fa nulla, il compilatore si limita a compilare.
Semmai e' il sistema operativo che puo' provvedere a rilasciare in
automatico le aree di memoria allocate, una volta che il sistema e'
terminato (Unix, per es., lo fa).
Questo comporterebbe il fatto che non e' *strettamente * necessario
deallocare, ma e' una pratica consigliabile ai fini della corretta
programmazione. Un compilatore C, normalmente, non fornisce al compilato un
sistema di garbage-collection (come avviene, ad. es., in Java) e quindi e'
buona norma rilasciare sempre cio' che viene allocato in modo dinamico.
--------------------------------
Inviato via 
http://usenet.libero.it

 wrote in
news:amfsh6$a5v$
4...@lacerta.tiscalinet.it
: 

In C, l'allocazione della memoria riguarda i puntatori. 
Se la variabile è un puntatore e questo viene inizializzato con 
malloc/calloc, deve essere deallocato con free.
Altre variabili non hanno necessità di essere allocate/liberate. Viene 
fatto in automatico.

 La vita di una variabile e`  limitata al blocco in cui e` dichiarata. Il
a meno che io non la dichiari come static, o sbaglio?
grazie per l'esauriente spiegazione!
Raffaele

 a meno che io non la dichiari come static, o sbaglio?
Non sbagli
Ciao,
Nicholas