2013-02-12 53 views
1

我很難找出seg故障的原因。我在GDB中進行了調試,它告訴我這條線給我帶來了麻煩,但我仍然無法弄清楚。作業分段錯誤。不知道爲什麼

Employee* readfile(FILE* file) { 
    Employee* newemployee; 
    char* tempsalary; 
    int salary; 
    char* name; 
    char* dept; 
    char line[128]; 
    while(file != NULL) { 
    fgets(name, sizeof(line), file); 
    newemployee->name = strdup(name); // THIS IS WHERE THE SEGFAULT IS 
    fgets(dept, sizeof(line), file); 
    newemployee->department = strdup(dept); 
    fgets(tempsalary, sizeof(line), file); 
    sscanf(tempsalary, "%d", &salary); 
    newemployee->salary = salary; 
    } 
    return newemployee; 

我試圖運行它的主程序應該打開文件,讀取行並創建一個Employee結構。它使用以前的函數打印結構。

int main() { 
    FILE* file; 
    file = fopen ("stest2.txt", "r"); 
    Employee* employees[max_employees]; 
    int i; 
    int c; 

    for (i = 0; i < max_employees; i++) { 
    employees[i] = readfile(file); 
    printEmployee(employees[i]); 
    } 

} 

回答

2

好像你有一個錯字,你的意思是:

fgets(name, sizeof(line), file); 

是:

fgets(line, sizeof(line), file); 

此外,

Employee* newemployee; 
newemployee->name = strdup(name); 

您只是取消了未初始化的指針,導致未定義的行爲
newemployee需要指向一個足夠大的內存以容納Employee對象,然後才能解除引用。

Employee* newemployee; 
Employee emp; 
newemployee = &emp; 
newemployee->name = strdup(name); 

兩個上述問題都在你的代碼複製。你需要解決這個問題。

+0

我解決了導致seg錯誤的問題,但現在程序運行時沒有打印結果並結束。有任何想法嗎? – 2013-02-12 04:17:02

2

沒有內存分配給name。所以

fgets(name, sizeof(line), file); 

很可能是後來出現的問題。

分配內存name在讀入行之前。

+0

也是新員工和臨時工。 – SecurityMatt 2013-02-12 04:06:22

+0

謝謝,解決了段錯誤。現在我需要弄清楚爲什麼程序永遠不會結束。 – 2013-02-12 04:19:02

+0

你必須在while循環中改變你的條件。 'while(file!= NULL)'一旦文件成功打開,總是爲真。 – 2013-02-12 04:20:28

2

您的指針似乎沒有分配內存。新員工,部門,名稱,tmpsalary。

+0

謝謝修復它! – 2013-02-12 04:38:09

1

您將「newemployee」聲明爲Employee類實例的指針,但您永遠不會實際分配新的Employee。在C++中,以下兩個調用通常是等價的(除非您使用操作符重載,在這種情況下你不):

newemployee->name = "hello"; 
(*newemployee).name = "hello"; 

因爲你從來沒有指定任何內容到「newemployee」指針,你最終取消引用一個完全隨機的內存位置,這不屬於您的進程,因此您的操作系統會立即殺死它 - 通過發信號通知段錯誤。