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.