codice:
struct esempio {
         int ID;                         
         stringa arrayDiNomi[4];        
    };
Lettura e scrittura tramite struct è possibile a condizione di mantenere i campi fissi, altrimenti anche il sistema di scrittura e/o lettura dev'essere dinamico.

Rendere dinamico arrayDiNomi significa solo cercare rogne. Dovresti trasformarlo in un puntatore e allocarlo con la malloc, però quando leggerai con la fread, il puntatore sarà sovrascritto e perderai la memoria puntata; nel puntatore ci sarà spazzatura (non quello che intendi leggere) e sicuramente prima o poi avrai un crash.
Se le stringhe che vuoi leggere sono precedute da un intero, potresti leggere prima l'intero ed effettuare una successiva fscanf con un buffer adeguatamente dimensionato.