Segmentation Fault Strutture annidate

di il
4 risposte

Segmentation Fault Strutture annidate

Buongiorno,
Ho un problema con un esercizio che mi richiede di creare una struttura Libretto in cui all'interno vi è una struttura chiamata Studente formata da nome, cognome, matricola.
Il mio primo sviluppo è stato creare un array di libretto per poi far inserire tramite un ciclo for tutti gli studenti.
Il problema è che nell'inizializzazione dei campi di studente il compilatore mi da Segmentation Fault.
Purtroppo dovendo utilizzare il metodo di Information Hiding in basso troverete solo il codice della libreria creata da me.
Qualcuno può spiegarmi dove sbaglio?
Allego qui il codice che ho scritto:
#define MAX_STUD 10
#define MAX_ES 5

struct libretto{
    struct studente *studente;
}libretto[MAX_STUD];

struct studente{
    char *nome;
    char *cognome;
    double matricola;
};


Libretto newLibretto(){ //Funzione che alloca la memoria necessaria
    Libretto libretto=malloc(sizeof(struct libretto)*MAX_STUD);
return libretto;
}


void insertStudents(Libretto lib[]){ //Funzione che inserisce gli studenti nel libretto

    char *nome, *cognome;
    double matricola;
    int size,i;
    printf("Quanti studenti vuoi inserire? ");
    scanf("%d", &size);

    for(i=0;i<size;i++){
         printf("Inserisci nome: ");
         scanf("%s", lib[i]->studente->nome);
         printf("Inserisci cognome: ");
         scanf("%s", lib[i]->studente->cognome);
         printf("Inserisci la matricola: ");
         scanf("%lf", &matricola);
         lib[i]->studente->matricola=matricola;
    }

}

4 Risposte

  • Re: Segmentation Fault Strutture annidate

    Ciao, per postare il codice sul forum utilizza gli appositi TAG "code" (bottone </> nell'editor completo).
    Assicurati inoltre che il codice sia compilabile, per esempio nel caso in esame l'identificatore Libretto (da notare la L maiuscola) non costituisce un tipo.

    Infine chiedo: ma il libretto non dovrebbe essere qualcosa di personale? Quello che tu stai cercando di implementare mi sembra più una sorta di registro di classe!
  • Re: Segmentation Fault Strutture annidate

    Non puoi usare i puntatori con le scanf senza avere allocato preventivate lo spazio in memoria
  • Re: Segmentation Fault Strutture annidate

    oregon ha scritto:


    Non puoi usare i puntatori con le scanf senza avere allocato preventivate lo spazio in memoria
    Ciao ti ringrazio per la risposta!
    Quindi conviene utilizzare un array di char? Per poi utilizzare le funzioni strcpy della libreria string.h?
    Io pensavo che utilizzando la malloc sulla struttura libretto riuscissi ad allocare la memoria anche delle struct annidate al suo interno. Mi confermi? O devo utilizzare la malloc anche per la struttura studenti?
  • Re: Segmentation Fault Strutture annidate

    Non è che "conviene". Se vuoi usare i puntatori, prima devi allocare lo spazio, altrimenti usi gli array di char dove servono.

    Dipende da quello che devi fare con l'esercizio e cosa state studiando.

    Con quella malloc allochi solo lo spazio per i puntatori contenuti nella struttura Libretto. Che però non punteranno a loro volta a memoria allocata. Dopo che allochi tale spazio, dovrai anche allocare lo spazio per i singoli array di char.

    Come regola, se hai un puntatore devi allocare lo spazio relativo con la malloc.

    E poi liberarla quando non serve con la free.

    P.S. L'errore di "segmentation fault" lo avrai ogni volta che hai fatto errori di mancata allocazione di memoria per un puntatore.
Devi accedere o registrarti per scrivere nel forum
4 risposte