Homepage  Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum


.dsy:it. .dsy:it. Archive > Didattica > Corsi A - F > Algoritmi e strutture dati
 
info allocazioni di memoria
Clicca QUI per vedere il messaggio nel forum
fra85
Ciao ragazzi,mi sto trovando in difficoltà con le allocazioni di memoria.
Non sono molto pratica di c,sto iniziando a studiarlo da poco, e ho notato che bisogna allocare la memoria quando si inizializzano le liste e deallocarla quando si eliminano gli elementi della lista.
Di solito in java,per svuotare una lista per esempio assegnavo a
testa= NULL e automaticamente mi svuotava la lista. Con c tutto questo è possibile???

Ho implementato dei codici per deallocare lo spazio relativo ad un nodo della lista,ma poi il puntatore non mi punta più alla lista ancora piena ma a null e non capisco perchè...


//mi estrae la testa,e mi restituisce l'attuale testa della lista
struct nodo_lista_adiacenti *estrai_testa(struct nodo_lista_adiacenti *testa)
{
struct nodo_lista_adiacenti *corrente;
corrente= testa;

if(corrente != NULL)
{
testa= testa->next;
free(corrente);

}
return testa;
}

oppure

struct nodo_lista_adiacenti *elimina_elemento_lista(int n,struct nodo_lista_adiacenti *testa)
{
struct nodo_lista_adiacenti *corrente, *precedente;

for ( corrente = testa , precedente = NULL ;
corrente != NULL && corrente -> info != n;
precedente = corrente , corrente = corrente -> next );

//caso in cui non si trova n e arriviamo alla fine
if ( corrente == NULL ) return testa ;
if ( precedente == NULL ) testa = testa -> next ;//n si trova nel primo nodo
else precedente -> next = corrente -> next ;
free ( corrente );

return testa ;

}

I codici mi sembrano giusti,senza la deallocazione funziona tutto bene,appena aggiungo la deallocazione ho problemi...

Grazie...

panzone
Non funziona perchè uccidi direttamente l' intera lista.

Nel primo caso, stai uccidendo l' intera lista. free() libera l' intera area allocata, non solo la prima posizione come intendi fare in questo caso. Oltretutto, modifichi il valore di testa presente nello stack e non il puntatore vero e proprio. Stesso, identico discorso con la seconda funzione. All' uscita da quelle funzioni in pratica punti ad un area che non ti appartiene più e ti alza un sigsegv

E no, con C non esiste il mettere un puntatore allocato a NULL ( se prima non lo liberi ), è un immenso memory leak. In java puoi farlo perchè, quando rendi un oggetto NULL questo viene gestito dal garbage collector che capisce che vuoi che l' oggetto venga eliminato e si occupa della sua rimozione ( ok, non è vera sempre la frase sopra ma rende l' idea ). In c devi fare tutto questo lavoro a mano.

fra85
Ho capito...ma adesso come devo sistemare le funzioni che ho scritto per non darmi problemi?

panzone
Originally posted by fra85
Ho capito...ma adesso come devo sistemare le funzioni che ho scritto per non darmi problemi?


Non c' è una risposta univoca, dipende come hai intenzione di sfruttare la struttura dati.

fra85
Guarda ti posto il codice dove la uso così magari mi spiego meglio,ho provato anche altre soluzioni ma non funziona:


struct nodo_lista_adiacenti *bfs(struct vertice *grafo, int i, int dim)
{
int confronto;
//inizializzo la coda vuota
struct nodo_lista_adiacenti *lista=NULL, *testa, *adiacenti=NULL, *da_restituire=NULL;
//coloro tutti i vertici di bianco
vertici_bianchi(grafo, dim);
// i è l'indice del vertice da cui parte l'esplorazione
strcpy(grafo[i].colore, "grigio");
grafo[i].distanza_precedente= 0;
grafo[i].predecessore= 0;
//inserisco in coda alla lista i che è un indice
lista= inserisci_valore_in_coda(i, lista);
while(lista != NULL)
{
testa= visualizza_testa(lista);
lista=estrai_testa(lista);
adiacenti= cerca_adiacenti(testa->info, grafo);

while(adiacenti != NULL)
{
if( (confronto= (strcmp(grafo[adiacenti->info].colore, "bianco"))) == 0)
{
strcpy(grafo[adiacenti->info].colore, "grigio");
grafo[adiacenti->info].distanza_precedente= grafo[testa->info].distanza_precedente +1;
grafo[adiacenti->info].predecessore= testa->info; //attenzione si tratta dell'indice
lista= inserisci_valore_in_coda(adiacenti->info, lista);
//in questa lista tengo in memoria gl'indici dei nodi raggiungibili dall'indice i
da_restituire= inserisci_valore_in_coda(adiacenti->info, da_restituire);
}
adiacenti= adiacenti->next;
}
strcpy(grafo[testa->info].colore, "nero");

}
return da_restituire;
}

mi serve il puntatore alla lista per poter usare la lista successivamente...

panzone
Non riesco a capire: l' ordine in cui i dati sono inseriti nella struttura è importante o inifluente ?

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate