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] ;
} ;