PDA

Visualizza la versione completa : [C] Segmentation Fault seconda chiamata alla calloc!


Smoke666
27-03-2012, 13:03
Ciao a tutti, ho un problema con un segmentation fault generato nel momento in cui viene invocata la funzione calloc. Tuttavia il problema si pone in un punto ben preciso del mio programma, perchè tutte le altre altre parti che utilizzano tale funzione vanno a buon fine...Posto un po di codice per farvi capire meglio.




scheda_t* new_scheda()
{
scheda_t* s=calloc(1, sizeof(scheda_t)); //segfault alla seconda iterazione, la prima va a buon fine....
if(s==NULL) return;
s->autore = NULL;
return s;
}

void free_scheda(**ps)
{
if( (ps == NULL) || (*ps == NULL) ) return;
else{
((**ps).autore) = NULL;
memcpy(((*ps)->titolo), STRING_NULL, sizeof((*ps)->titolo));
memcpy(((*ps)->nota), STRING_NULL, sizeof((*ps)->nota));
memcpy(((*ps)->collocazione), STRING_NULL, sizeof((*ps)->collocazione));
memcpy(((*ps)->descrizione_fisica), STRING_NULL, sizeof((*ps)->descrizione_fisica));
*ps= NULL;
}

free(*ps);
free(&ps);
}


funzione1
........ //dichiara le sue cose
scheda_t* s=new_scheda();
........//continua senza problemi alla prima chiamata.

main()

c=funzione1 //termina con successo
free_scheda();
funzione1() //ha come argomento c calcolato dalla prima invocazione della funzione



Come avrete capito scheda_t è un tipo da me definito che contiene delle stringhe, le inizializzo copiando dentro ognuna di loro una stringa nulla. Non capisco perchè solo durante quella chiamata la calloc mi da il segfault...Aiutatemi voi! :dhò:

oregon
27-03-2012, 13:10
La calloc non ti può dare seg fault, forse sarà la free ...

Ma che senso hanno queste due righe



free(*ps);
free(&ps);


e che senso hanno tutte quelle copie (memcpy) dato che la struttura la stai deallocando?

E poi ... perché chiami la free in questo modo

free_scheda();

??

Smoke666
27-03-2012, 13:14
La chiamata attraverso free_scheda() mi serve per poter copiare nelle stringhe della struttura la stringa nulla, e per assegnare a un puntatore contenuto nella struttura stessa, il valore "NULL". La funzione riceve in ingresso un doppio puntatore, quindi, dopo aver fatto quello che devo fare con le stringhe, faccio la free sul puntatore e sulla scheda...

Smoke666
27-03-2012, 13:16
Comunque seguendo il flusso di esecuzione attraverso il debugger, il segfault viene generato nella chiamata alla new_scheda subito dopo la calloc....Come può essere la free?

oregon
27-03-2012, 13:18
Originariamente inviato da Smoke666
La chiamata attraverso free_scheda()

Ma la funzione accetta un parametro e tu non lo passi!


mi serve per poter copiare nelle stringhe della struttura la stringa nulla, e per assegnare a un puntatore contenuto nella struttura stessa, il valore "NULL".

Ma a cosa serve azzerare le stringhe se poi liberi la memoria della struttura che le contiene? Le memcpy sono inutili.


La funzione riceve in ingresso un doppio puntatore, quindi, dopo aver fatto quello che devo fare con le stringhe, faccio la free sul puntatore e sulla scheda...

Ma non ha senso fare due free! Non ha fatto due allocazione per la scheda ma una sola.

Smoke666
27-03-2012, 13:26
Dunque, la chiamata alla free_scheda nel test è: free_scheda(&s). Quindi la funzione deve essere semplicemente:



void free_scheda(**ps)
{
if( (ps == NULL) || (*ps == NULL) ) return;
free(*ps);
return;
}



Però mi convince poco quel *ps...Mi sa che ho fatto un errore, vero? :dhò:

oregon
27-03-2012, 14:22
Il codice è semplicemente

if(*ps) free(*ps);

Smoke666
27-03-2012, 14:35
C'è un grosso problema però... Anche qui ora c'è un segfault, ti posto l'output che ottengo....




*** glibc detected *** ./prova: free(): corrupted unsorted chunks: 0x098e9008 **



Non ho mai visto un errore del genere...Sto cercando su google come risolvere, e ti giro la domanda :-) Cosa potrebbe essere?

oregon
27-03-2012, 14:38
E' semplicemente un problema di free su puntatori non validi ... in ogni caso, è un problema di allocazione di memoria.

Le regole sono semplici ... ad ogni allocazione corrisponde una free (a patto che non ci siano errori nelle allocazioni).

Dato che non ho capito più su quale codice ragioniamo, posta *tutto* il codice compilabile (dove non manchi nulla, dalle strutture al main) in modo da fare copia-incolla, compilazione e test.

Smoke666
27-03-2012, 14:55
Rimando per MP se non lo hai copiato....

Loading