La fread legge il numero di byte che gli si passa come parametro. Se si passa sizeof(struct esempio) leggerà comunque 8 byte (4 dell'int + 4 del puntatore) e li andrà a mettere nella variabile passata come parametro tramite un'operazione di copia bruta.
Ovviamente la fread non può sapere se la struttura contiene puntatori o no, quindi sovrascrive anche l'eventuale puntatore contenuto, che non punterà più alla memoria "mallocata" ma a qualcos'altro.