[Tech] OT - Programmazione C

david mugnai dvd@noemalab.org
Gio 19 Feb 2004 11:23:55 CET


Valerio Montagnani 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?
Ti hanno risposto gia' in tanti sul perche' riottieni lo stesso valore
dopo la free, pero vorrei farti notare un'altra cosa:

> float *buff[10];
Qui dichiari un vettore di 10 puntatori a float, quindi l'indice di tale 
vettore va da 0 a 9

>  if ((buff[10]=(float *)malloc(10)))==NULL) {
Qui utilizzi l'11 elemento del vettore, sei gia' in condizione di 
segmentation fault, stai scrivendo nella locazione
buff+11*sizeof(float*) che *non* ti appartiene.

Il fatto che il tuo programma funzioni e' solo un caso :-)

>  printf("%p %d\n",&buff[5],buff[5]);
>  free(buff);
>  printf("%p %d\n",&buff[5],buff[5]);

Come ti e' stato detto deferenziare un'area di memoria non piu' allocata 
e' "comportamento indefinito" a volte puo' funzionare altre volte no
Anche qui "caso"

ciao

-- 
A hacker does for love what others would not do for money.



Maggiori informazioni sulla lista flug-tech