[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