2013-02-12 69 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”指针,你最终取消引用一个完全随机的内存位置,这不属于您的进程,因此您的操作系统会立即杀死它 - 通过发信号通知段错误。