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