2017-09-17 6 views
0

Je continue de recevoir une erreur de segmentation lorsque j'essaie d'ouvrir un fichier en utilisant fopen et une structure qui contient un type FILE. Nouveau à C donc désolé si c'est une question noob. Code pour la struct:Réception d'une erreur de segmentation lors de l'utilisation d'une structure avec type FILE - C

typedef struct _FileInternal { 
    FILE* fp; 
    char mem[2]; 
} FileInternal; 

// file handle type 
typedef FileInternal* File; 

Code pour le fichier ouvert:

File open_file(char *name) { 
    File a; 

    fserror=NONE; 
    // try to open existing file 
    a->fp=fopen(name, "r+"); 
    if (! a->fp) { 
    // fail, fall back to creation 
    a->fp=fopen(name, "w+"); 
    if (! a->fp) { 
     fserror=OPEN_FAILED; 
     return NULL; 
    } 
    } 
    return a; 
} 

Essayer fichier f; f = fopen ("newfile.dat"); renvoie la panne

Toute aide est très appréciée!

+0

Voir [Est-ce une bonne idée de 'pointeurs typedef'?] (Http: // stackoverflow. com/questions/750178/is-it-a-good-idea-to-typedef-pointters) Considérez ceci comme une pièce à conviction - la réponse est "Non" (sauf peut-être vous avez affaire à des pointeurs de fonction). –

+0

Notez également que les noms commençant par un trait de soulignement et suivi d'un autre caractère de soulignement ou d'une lettre majuscule sont réservés à toute utilisation par l'implémentation. Ne créez pas de noms commençant par des underscores (simplistes mais sûrs). Ou lisez les règles complètes au § 7.1.1 Identificateurs réservés dans la norme C et dans les sections similaires des normes connexes (par exemple, POSIX). –

+0

Ce n'est pas une bonne idée de typer les pointeurs car ot rend le code illisible (vous savez quel est le pointeur, quel est l'objet réel, etc. car il ne provient pas de la déclaration). La seule exception sont les pointeurs de fonction. –

Répondre

1

File est un type de pointeur qui fait de a un pointeur. a n'est jamais initialisé pour pointer vers une structure FileInternal valide, de sorte que le déréférencement peut provoquer une erreur de segmentation.

0

Vous avez déréférencement d'un pointeur sans faire une allocation de mémoire avant, pour résoudre ce problème font ceci:

File open_file(char *name) { 
    File a = (File) malloc(sizeof(FileInternal));