Ho il seguente codice che (si compila correttamente) ma crasha all'esecuzione di questa stringa di comando:
printf("\n\t %s", p->studente.nome);
dove il campo .nome è un: char *nome, della variabile struct studente, puntata da p.
Vi riporto tutto il codice, ma l'errore avviene soltanto li, vi chiedo se sapete dirmi il perchè, in particolare voglio capire se avviene perchè c'è un errore PRECEDENTE, ovvero all'atto della memorizzazione della stringa nel campo nome, oppure se è un errore proprio di quella stringa di comando (ma a me sembra il modo corretto di dirgli di stamparla).
Ecco il codice.
Il file da cui attinge i dati (nome, cognome,anno di nascita,matricola,voto) è un normalissimo studenti.txt nel quale ho inserito delle righe random così:
Alberto Mannucci 1983 35789 21
Giovanni Maccioni 1983 35432 30
Giorgio Mameli 1981 36837 28
Luca Pischedda 1981 33654 23
Giovanni Frigau 1983 32987 29
Francesca Barbarossa 1983 34789 30
codice:
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
struct studente { char *nome;
char *cognome;
int anno;
int matricola;
int voto;};
typedef struct studente STUDENTE;
typedef struct Cell CELL;
struct Cell {STUDENTE studente;
CELL *next;};
CELL *crealista2(char *nomefile);
void visualizzalista(CELL *p);
main()
{
int numstud;
CELL *list;
list=crealista2("studenti.txt"); //crea la lista e prende i dati dal file
printf("\n\n");
visualizzalista(list);
printf("\n\n");
system("pause");
}
CELL *crealista2(char *nomefile)
{
int i=0;
CELL *p, *paus;
FILE *fp;
fp=fopen(nomefile,"r");
p=(CELL *)malloc(sizeof(CELL)); /* creo la lista e p sarà il puntatore al primo elemento */
p->studente.nome=(char *)malloc(30*sizeof(char)); /* è corretto allocare dinamicamente questa memoria se prima l'ho gia allocata per la strutura CELL, del quale questo campo fa parte?..Non è come se stessi "ingrandendo" il sizeof(CELL) ? */
fscanf(fp,"%s", &p->studente.nome);
p->studente.cognome=(char *)malloc(30*sizeof(char));
fscanf(fp,"%s", &p->studente.cognome);
fscanf(fp,"%d", &p->studente.anno);
fscanf(fp,"%d", &p->studente.matricola);
fscanf(fp,"%d", &p->studente.voto);
paus=p;
i++;
// creo le celle successive
while(!feof(fp)) {
paus->next=(CELL *)malloc(sizeof(CELL));
paus=paus->next;
paus->studente.nome=(char *)malloc(30*sizeof(char));
fscanf(fp,"%s", &paus->studente.nome);
paus->studente.cognome=(char *)malloc(30*sizeof(char));
fscanf(fp,"%s", &paus->studente.cognome);
fscanf(fp,"%d", &paus->studente.anno);
fscanf(fp,"%d", &paus->studente.matricola);
fscanf(fp,"%d", &paus->studente.voto);
i++;
}
paus->next=NULL;
fclose(fp);
printf("\n\n Hai inserito %d elementi non nulli\n\n",i);
return (p);
}
void visualizzalista(CELL *p) // p=list
{
printf("\nVisualizzazione lista inserita:\n\n");
printf("\n list----> ");
while(p!=NULL){
// printf("\n\t %s", p->studente.nome); <---se levate gli slash del commento vedrete che crasha
// printf("\n\t %s", p->studente.cognome);
printf("\n\t %d", p->studente.anno);
printf("\n\t %d", p->studente.matricola);
printf("\n\t %d", p->studente.voto);
printf("\n---->");
p=p->next; //p punta il PROSSIMO elemento della lista
}
printf("NULL\n\n");
}