Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214

    [C] Segmentation Fault seconda chiamata alla calloc!

    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.

    codice:
    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!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    La calloc non ti può dare seg fault, forse sarà la free ...

    Ma che senso hanno queste due righe

    codice:
    	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();

    ??
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    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...

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    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?

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Dunque, la chiamata alla free_scheda nel test è: free_scheda(&s). Quindi la funzione deve essere semplicemente:

    codice:
    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?

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Il codice è semplicemente

    if(*ps) free(*ps);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    C'è un grosso problema però... Anche qui ora c'è un segfault, ti posto l'output che ottengo....

    codice:
       
    
    *** 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?

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Rimando per MP se non lo hai copiato....

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.