2017-09-17 37 views
0

嘗試通過使用fopen和包含FILE類型的結構來打開文件時,我總是收到分段錯誤。如果這是一個noob問題,那麼對C來說很抱歉。 代碼的結構:使用FILE類型的結構時接收到分段錯誤 - C

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

// file handle type 
typedef FileInternal* File; 

代碼文件打開:

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; 
} 

試圖 文件f; f = fopen(「newfile.dat」); 返回故障

任何幫助非常感謝!

+0

參見[這是個好主意,'typedef'指針?](HTTP://計算器。 com/questions/750178/is-it-a-good-idea-to-typedef-pointers)考慮這是一個起訴展覽 - 答案是「否」(除非你正在處理函數指針)。 –

+0

另請注意,名稱以下劃線開頭,後面跟着另一個下劃線或大寫字母保留供實施使用。不要創建以下劃線開頭的名字(簡單但安全)。或者閱讀C標準中的§7.1.3保留標識符以及相關標準中的類似章節(例如POSIX)中的全部規則。 –

+0

將typedef指針設置爲使代碼無法讀取(您確實知道指針是什麼,實際對象是什麼,因爲它不是來自聲明)並不是一個好主意。唯一的例外是函數指針。 –

回答

1

File是一個指針類型,它使a成爲一個指針。 a永遠不會初始化爲指向有效的FileInternal結構,因此解除引用會導致seg錯誤。

0

您已經提領的指針不前做一個內存分配,解決這個問題做到這一點:

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