Nel codice che hai postato non vedo errori di sorta. L'unica cosa che mi venga in mente è che usi la tua struttura in un altro punto non inizializzata, cosa per altro sicura se l'apertura del file fallisce.
Personalmente io cambierei la funzione nuovo così:
Codice PHP:
struttura *nuovo(char *fname) {
struttura *St;
/* controlli vari sul nome del file */
FILE *fp = fopen(fname,"r");
if (!fp) return NULL; //
/*non ci sono errori, inizializza */
St = (struttura *)malloc(sizeof(struttura));
if (!St) return NULL;
St->file=fp;
St->stato=APERTO; // all'inizio APERTO di default
St->x=1; // valore iniziale di default
return St;
}
oppure puoi allocare la struttura al di fuori della tua funzione e controllare all'interno se il puntatore che passi sia valido.