1

我无法找出段错误的原因。我已经在 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

4 回答 4

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

上述两个问题都在您的代码中重复出现。你需要解决这个问题。

于 2013-02-12T04:02:07.090 回答
2

没有为 分配内存name。所以

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

很可能是后来出现的问题。

name在将行读入之前分配内存。

于 2013-02-12T04:02:07.367 回答
2

您的指针似乎都没有分配内存。新员工,部门,姓名,tmpsalary。

于 2013-02-12T04:04:56.003 回答
1

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

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

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

于 2013-02-12T04:07:14.570 回答