|
|
|
|
 |
|  |
 |
fra85 |
| info allocazioni di memoria |
01-02-2012 17:32 |
|
 |
fra85 |
.primate.
Registered: Mar 2011
Posts: 77 (0.01 al dì)
Location:
Corso: informatica
Anno: terzo anno
Time Online: 10:51:29 [...]
Status: Offline
Edit | Report | IP: Logged |
info allocazioni di memoria
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...
|
|
01-02-2012 17:32 |
|
|
|  |
 |
panzone |
| Non funziona perchè uccidi direttamente l' intera ... |
01-02-2012 18:34 |
|
 |
panzone |
.primate.
Registered: Sep 2010
Posts: 63 (0.01 al dì)
Location: Vigevano
Corso: Informatica
Anno: 2
Time Online: 16:10:18 [...]
Status: Offline
Edit | Report | IP: Logged |
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.
|
|
01-02-2012 18:34 |
|
|
|  |
 |
fra85 |
| Ho capito...ma adesso come devo sistemare le funzi ... |
01-02-2012 19:34 |
|
 |
fra85 |
.primate.
Registered: Mar 2011
Posts: 77 (0.01 al dì)
Location:
Corso: informatica
Anno: terzo anno
Time Online: 10:51:29 [...]
Status: Offline
Edit | Report | IP: Logged |
Ho capito...ma adesso come devo sistemare le funzioni che ho scritto per non darmi problemi?
|
|
01-02-2012 19:34 |
|
|
|  |
 |
panzone |
| [QUOTE][i]Originally posted by fra85 [/i]
... |
01-02-2012 19:51 |
|
 |
panzone |
.primate.
Registered: Sep 2010
Posts: 63 (0.01 al dì)
Location: Vigevano
Corso: Informatica
Anno: 2
Time Online: 16:10:18 [...]
Status: Offline
Edit | Report | IP: Logged |
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.
|
|
01-02-2012 19:51 |
|
|
|  |
 |
fra85 |
| Guarda ti posto il codice dove la uso così magari ... |
02-02-2012 10:26 |
|
 |
fra85 |
.primate.
Registered: Mar 2011
Posts: 77 (0.01 al dì)
Location:
Corso: informatica
Anno: terzo anno
Time Online: 10:51:29 [...]
Status: Offline
Edit | Report | IP: Logged |
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...
|
|
02-02-2012 10:26 |
|
|
|  |
 |
panzone |
| Non riesco a capire: l' ordine in cui i dati sono ... |
03-02-2012 14:42 |
|
 |
panzone |
.primate.
Registered: Sep 2010
Posts: 63 (0.01 al dì)
Location: Vigevano
Corso: Informatica
Anno: 2
Time Online: 16:10:18 [...]
Status: Offline
Edit | Report | IP: Logged |
Non riesco a capire: l' ordine in cui i dati sono inseriti nella struttura è importante o inifluente ?
|
|
03-02-2012 14:42 |
|
|
|  |
 |
| All times are GMT. The time now is 14:57. |
|
|
 |
|
 |
|
|
|  |
Forum Rules:
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
|
HTML code is OFF
vB code is ON
Smilies are ON
[IMG] code is ON
|
|
|
|
|
|