L'errore è qui:
codice:
struct persona {
int numero ;
char *nome ;
char cognome [6] ;
} ;
cioè che usi un puntatore e poi serializzi la struttura.
Quando vai a scrivere, non scrivi il contenuto di nome, ma il valore del puntatore.
Allo stesso modo quando vai a leggere, assegni a quel puntatore 4 bytes presi nel file che non sono quelli che vorresti. E tutto questo è indipendente da una allocazione tramite malloc.
Se vuoi serializzare la struttura con:
codice:
fwrite (&persona , sizeof (struct persona ) , 1 , Jtr ) ;
fread (&persona , sizeof (struct persona ) , 1 , Jtr ) ;
quel campo deve avere dimensione fissa.
codice:
struct persona {
int numero ;
char nome[10] ;
char cognome [6] ;
} ;