Per essere veramente completo, dovresti controllare che il puntatore restituito dalla malloc non sia NULL.
In quel caso, dovresti interrompere il programma con un messaggio di "memoria non disponibile".
In un contesto di "test"/"didattico" va pure bene ma in "produzione" devi prevedere il controllo.

Per finire, in generale la fread/fwrite la puoi usare tranquillamente in questo modo ma *non* puoi se nella struttura ci sono dei puntatori (che dovrai trattare a parte riallocando lo spazio come fai in questo programma).