作业上的分段错误。无法弄清楚为什么

时间:2013-02-12 03:59:57

标签: c struct segmentation-fault

我无法找出出现故障的原因。我在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]);
  }

}

4 个答案:

答案 0 :(得分: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);

上述两个问题都会在整个代码中复制。你需要解决这个问题。

答案 1 :(得分:2)

没有为name分配内存。所以

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

可能是稍后出现的问题。

在读取行内容之前为name分配内存。

答案 2 :(得分:2)

你的指针似乎都没有分配内存。 NewEmployee,Dept,name,tmpsalary。

答案 3 :(得分:1)

您将“newemployee”声明为指向Employee类实例的指针,但您实际上从未实际分配过新的Employee。在C ++中,以下两个调用通常是等效的(除非您使用运算符重载,在这种情况下您不是):

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

由于您从未向“newemployee”指针分配任何内容,因此您最终取消引用一个完全随机的内存位置,该位置不属于您的进程,因此您的操作系统会立即将其杀死 - 通过发出段错误信号。 / p>