Bueno, tienes un par de errores de lógica por lo que veo a primera vista.
Código:
...
void abrir() {
FILE * fp;
fp = fopen("gastos.dts", "rb");
_gasto *aux;
aux = (_gasto *) malloc(sizeof(_gasto));
while (!feof(fp)) {
fread(aux, sizeof(_gasto), 1, fp);
printf(" | %3d | %10s | %30s | %2i/%2i/%4i | %5i |\n",
aux->i, aux->nombre, aux->concepto, aux->fecha.dia,
aux->fecha.mes, aux->fecha.ano, aux->importe);
aux = aux->sigGasto;
}
fclose (fp) ;
}
...
En la linea que te marqué, ¿quién es siguiente? Se que es el siguiente elemento de la lista, pero no has reservado memoria para el, así que quien sabe donde te esté guardando los datos, deberías reservar memoria para el siguiente nodo antes de usarlo.
Otra cosa es que no estás liberando la memoria que usar al final de tu programa, eso crea lo que se llama
memory leaks, asegurate de hacer un
free de todo lo que reservaste al final de tu programa o de cada función dependiendo de lo que hiciste.
Saludos