[Tech] OT - Programmazione C

Valerio Montagnani tech@vmontagnani.it
Sab 21 Feb 2004 17:00:26 CET


On Wed, 18 Feb 2004 20:05:28 +0100
Marco Ermini <markoer@usa.net> wrote:

> On Wed, 18 Feb 2004 18:20:32 +0100, Valerio Montagnani <tech@vmontagnani.it>
> wrote:
> 
> > Ciao a tutti.
> > 
> > Ho provato a scrivere un programmino che allocasse dinamicamente un po' di
> > memoria, stampasse indirizzo e contenuto di una cella e infine liberasse
> > la RAM allocata precedentemente. Ho aggiunto, dopo la funzione free, una
> > printf che avrebbe dovuto stampare i valori della cella di ram ottenuti
> > prima di aver liberato la memoria. Mi sarei aspettato un errore o un
> > risultato casuale, dato che quella locazione sarebbe dovuta essere vuota,
> > mentre il computer mi ha restituito gli stessi valori di prima. E'
> > possibile che abbia sbagliato a liberare la ram?
> 
> Liberare la RAM non significa cancellarla. Ma non ti eri comprato un amnuale
> di C?!?

Sì, ma usano il termine "deallocare". Una persona inesperta, leggendo, potrebbe essere indotta a pensare: dealloacare = sinonimo di liberare.
Per questo ho provato a vedere che cosa succedeva scrivendo questo programmino e a stampare (dopo la deallocazione) il contenuto della memoria usata con accesso dinamico.
> 
> 
> 
> > #include <stdio.h>
> > float *buff[10];
> > main() {
> >  if ((buff[10]=(float *)malloc(10)))==NULL) {
> >   printf("Errore di allocazione.");
> >   exit(1);
> >  }
> >  printf("%p %d\n",&buff[5],buff[5]);
> >  free(buff);
> >  printf("%p %d\n",&buff[5],buff[5]);
> 
> quest'ultima riga è un errore e può portarti al core dump. Cosa fai, stampi
> un'area di memoria che non ti appartiene?!? are you crazy? ;-)

Come detto prima volevo solo vedere che cosa era successo alla locazione di memoria.
> 
> Comunque è logico che ritorni la stessa cosa... l'hai solamente tolta
> dall'heap, NON l'hai cancellata... 

Ecco è proprio questo che volevo sapere ;).

Grazie mille, Vale


-- 
Valerio Montagnani        (Lug-Account)        <tech@vmontagnani.it>
              pub 1024/C7E4BC57    sub 2048g/0E170155
Key fingerprint = D5A4 EDFC 060C 5BD6 E2DD  8252 3B67 C1EB C7E4 BC57



Maggiori informazioni sulla lista flug-tech