(c) segmentation fault (core dump creato)

di il
32 risposte

32 Risposte - Pagina 2

  • Re: (c) segmentation fault (core dump creato)

    oregon ha scritto:


    @Elia... hai letto la mia risposta?

    @Alexv ... se usi la free il puntatore restituito dalla funzione e usato in seguito nel main non sarà più valido, come per la stringa all'interno della struttura. La responsabilità della liberazione della memoria è del chiamante (ovvero del main)
    Si, ho letto. Grazie mille.
  • Re: (c) segmentation fault (core dump creato)

    oregon ha scritto:


    @Elia ... invece di continuare a scrivere e andare a caso, vuoi dare un'occhiata alla mia risposta?
    Si, scusami.
  • Re: (c) segmentation fault (core dump creato)

    @oregon non ho capito perchè non dovrei fare la free.
  • Re: (c) segmentation fault (core dump creato)

    La funzione serve ad allocare la struttura il cui puntatore viene restituito al main per la stampa. Quindi la free va fatta dopo, quando non hai più bisogno del puntatore
    
    int main() {
    	mago* pMago = scelta_classe();
    	stampa_classe(pMago);
    	free(pMago);
    }
    
  • Re: (c) segmentation fault (core dump creato)

    oregon ha scritto:


    La funzione serve ad allocare la struttura il cui puntatore viene restituito al main per la stampa. Quindi la free va fatta dopo, quando non hai più bisogno del puntatore
    
    int main() {
    	mago* pMago = scelta_classe();
    	stampa_classe(pMago);
    	free(pMago);
    }
    
    Ahh, capito capito. Grazie infinite!!
  • Re: (c) segmentation fault (core dump creato)

    Chiedo scusa @oregon e @elia, avevo letto male il codice. Effettivamente così com'è scritto, l'oggetto mago viene distrutto a prescindere all'uscita della funzione, e ovviamente non va bene. Se invece la free veniva chiamata SOLO in caso di scelta errata (quindi sotto la voce default del costrutto switch-case), allora aveva senso, ma in quel caso andava restituito un puntatore nullo, così da poterlo controllare nel chiamante.
  • Re: (c) segmentation fault (core dump creato)

    Alexv ha scritto:


    Chiedo scusa @oregon e @elia, avevo letto male il codice. Effettivamente così com'è scritto, l'oggetto mago viene distrutto a prescindere all'uscita della funzione, e ovviamente non va bene. Se invece la free veniva chiamata SOLO in caso di scelta errata (quindi sotto la voce default del costrutto switch-case), allora aveva senso, ma in quel caso andava restituito un puntatore nullo, così da poterlo controllare nel chiamante.
    Grazie mille lo stesso per la disponibilità e l'aiuto.
  • Re: (c) segmentation fault (core dump creato)

    Elia06_11 ha scritto:


    oregon ha scritto:


    La funzione serve ad allocare la struttura il cui puntatore viene restituito al main per la stampa. Quindi la free va fatta dopo, quando non hai più bisogno del puntatore
    
    int main() {
    	mago* pMago = scelta_classe();
    	stampa_classe(pMago);
    	free(pMago);
    }
    
    Ahh, capito capito. Grazie infinite!!
    In realtà, essendoci anche un altro puntatore allocato, dovresti liberare prima quello
    
    int main() {
    	mago* pMago = scelta_classe();
    	stampa_classe(pMago);
    	free(pMago->c_mago);		// prima questo
    	free(pMago);
    }
    
  • Re: (c) segmentation fault (core dump creato)

    oregon ha scritto:


    Elia06_11 ha scritto:


    oregon ha scritto:


    La funzione serve ad allocare la struttura il cui puntatore viene restituito al main per la stampa. Quindi la free va fatta dopo, quando non hai più bisogno del puntatore
    
    int main() {
    	mago* pMago = scelta_classe();
    	stampa_classe(pMago);
    	free(pMago);
    }
    
    Ahh, capito capito. Grazie infinite!!
    In realtà, essendoci anche un altro puntatore allocato, dovresti liberare prima quello
    
    int main() {
    	mago* pMago = scelta_classe();
    	stampa_classe(pMago);
    	free(pMago->c_mago);		// prima questo
    	free(pMago);
    }
    
    Esatto, ma devo fare questa scelta di classe per due maghi (che sarebbero i due giocatori). Successivamente di entrambi i maghi devo stampare il corrispettivo mazzo, stampando prima a schermo un messaggio del tipo "Il mazzo di "..." che ha classe "..." è:". Se facessi free(pMago->c_mago) prima di stampare questo messaggio non mi stamperebbe la classe che hanno selezionato i giocatori.

    Non so se mi sono spiegato.
  • Re: (c) segmentation fault (core dump creato)

    Le free che ti ho indicato valgono solo nell'esempio mostrato. Ovviamente nel tuo programma vanno fatte SOLO dopo che non hai più bisogno delle strutture allocate. Capito?
  • Re: (c) segmentation fault (core dump creato)

    oregon ha scritto:


    Le free che ti ho indicato valgono solo nell'esempio mostrato. Ovviamente nel tuo programma vanno fatte SOLO dopo che non hai più bisogno delle strutture allocate. Capito?
    Quindi la free(pMago -> c_mago) le devo fare dopo che le ho usate per stampare il messaggio che le ho detto prima.
  • Re: (c) segmentation fault (core dump creato)

    La regola è semplice... la free la fai quando il dato allocato non ti serve più. E sarebbe buona norma assegnare NULL al puntatore dopo la free

    free(pMago -> c_mago);
    pMago -> c_mago=NULL;
  • Re: (c) segmentation fault (core dump creato)

    @oregon Okay. Ma se utilizzo il puntatore due volte, una volta per un mago, una volta per un altro, è necessario fare free 2 volte (ogni volta che lo ho finito di utilizzare per ogni mago), oppure solo una volta quando ho concluso di utilizzarlo per entrambi?
  • Re: (c) segmentation fault (core dump creato)

    Ad ogni malloc deve corrispondere una free
  • Re: (c) segmentation fault (core dump creato)

    oregon ha scritto:


    Ad ogni malloc deve corrispondere una free
    Buongiorno,
    Ho capito, grazie mille.

    Ti volevo fare un'altra domanda, perché quando stampo questo messaggio:
    
    printf("\nIl mazzo di %s classe %s \n", Mago1.nome_mago, Mago1.c_mago);
    
    Dopo il primo %s mi va a capo e non mi stampa tutto su una riga?
Devi accedere o registrarti per scrivere nel forum
32 risposte