Data l'idiozia sulle parentesi quadre (scusate ... sto alle prime armi ), provo a rifarmi.

Oltre ovviamente al giusto "errore" di assegnare un comp* a un comp (che è stato già segnalato), ne vorrei aggiungere un altro.

Spero non sia una boiata pure questa. Nel codice postato all'inizio, non si aggiorna pa con il valore di ritorno della realloc.
Eppure realloc non è detto che "ingrandisca" sempre l'area di memoria puntata da pa (in tal caso, l'indirizzo rimarrebbe lo stesso).
Se questa è insufficiente, alloca una NUOVA area di memoria e restituisce quindi il nuovo puntatore, cioè un diverso indirizzo di cui non si tiene conto di volta in volta.

Quando questo accade, pa continua a puntare alla vecchia area di memoria non più utilizzata.

Ho riacquistato qualche punto o continuo lo sprofondo nell'abisso???