PDA

View Full Version : [c] malloc e free ------> segmentation fault


nefer
21-04-2005, 14:40
Ciao a tutti!!

Non riesco a venire a capo di questo problema!

Ho scritto un programma che utilizza una semplicissima lista per memorizzare i dati! Su questa lista ho implementato una funzione chiamtata "inserisci" e una funzione chiamata "crea". Quest'ultima serve per cancellare i dati presenti e inizializzare nuovamente la lista!

Quando faccio partire il programma la inserisci funziona! dopo aver inserito qualche elemento chiamo la crea e successivamente inserisco dei nuovi elementi. A questo punto, generalmente al terzo inserimento, il programma termina con segmentation fault. L'errore avviene al momento della chiamata malloc.

Il problema si verifica solo se chiamo la crea il cui codice è il seguente:
testa=NULL;
while(temp!=NULL)
{
temp1=temp;
temp=temp->pross;
temp1->pross=NULL;

free(temp1);
}
temp e temp1 sono dello stesso tipo di testa ovviamente!

Voi vedete in questo frammento l'origine del mio problema?????

h1jack3r
21-04-2005, 18:05
Ciao a tutti!!

Non riesco a venire a capo di questo problema!

Ho scritto un programma che utilizza una semplicissima lista per memorizzare i dati! Su questa lista ho implementato una funzione chiamtata "inserisci" e una funzione chiamata "crea". Quest'ultima serve per cancellare i dati presenti e inizializzare nuovamente la lista!

Quando faccio partire il programma la inserisci funziona! dopo aver inserito qualche elemento chiamo la crea e successivamente inserisco dei nuovi elementi. A questo punto, generalmente al terzo inserimento, il programma termina con segmentation fault. L'errore avviene al momento della chiamata malloc.

Il problema si verifica solo se chiamo la crea il cui codice è il seguente:
testa=NULL;
while(temp!=NULL)
{
temp1=temp;
temp=temp->pross;
temp1->pross=NULL;

free(temp1);
}
temp e temp1 sono dello stesso tipo di testa ovviamente!

Voi vedete in questo frammento l'origine del mio problema?????


beh questo pezzo di codice non può creare una lista se non c'è nemmeno una malloc, fa solo casini con la memoria..
prova a postare tutta la funzione con i vari parametri magari ne veniamo a capo.

nefer
21-04-2005, 18:37
Lo scopo del frammento di codice infatti non è quello di creare la lista bensì "dovrebbe" cancellarla!

Io non penso che il codice della inserisci possa essere utile poichè essa funziona! il problema si verifica solo se chiama la crea!!

Lo posto ugualmente perchè non si sa mai:

int inserisci(int a,int b, char s[10])
{
animali *temp;

temp=testa_animali;
int i=0;


if (temp==NULL)
{
temp=(animali*)malloc(sizeof(animali));
for(i=0;i<10;i++)
{
temp->specie[i]=' ';
}
i=0;
while(s[i]!='\n')
{
temp->specie[i]=s[i];
i++;
}// fine for
temp->x=a;
temp->y=b;
temp->pross=NULL;
testa_animali=temp;
temp=NULL;
num++;
}
else
{
while(temp!=NULL)
{
if((temp->x==a)&&(temp->y==b))
return 0;

temp=temp->pross;

}


temp=NULL;




temp=(animali*)malloc(sizeof(animali));



for(i=0;i<10;i++)
{
temp->specie[i]=' ';
}
i=0;
while(s[i]!='\n')
{
temp->specie[i]=s[i];
i++;
}// fine for
temp->x=a;
temp->y=b;
temp->pross=testa_animali;
testa_animali=temp;
num++;
temp=NULL;
}

temp=NULL;
return 1;

}// fine inserisci

h1jack3r
21-04-2005, 21:42
La crea dunque in realtà è una cancella, a cui devi passare per forza il primo elemento della lista.
Per cancellare tutta la lista io farei così

beh la funzione sarebbe una int (non la faccio void così posso stabilire se ha successo o meno)

int cancella(struct item *testa)
{
struct item *aux,newtesta;

while(testa!=NULL)
{

aux->testa=newtesta;
free(testa);
testa=newtesta;
}
return(1);
}




poi dovrai mettere un po' di controlli per gestire la fine e gli errori, io l'ho scritto un po' così di getto.
Ah la prox volta che inserisci codice indentalo nei tag CODE