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

初期化されていないポインターを逆参照したところ、Undefined Behaviorが発生しました。逆参照する前に、オブジェクト
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

どのポインタにもメモリが割り当てられていないようです。NewEmployee、部署、名前、tmpsalary.

于 2013-02-12T04:04:56.003 に答える
1

Employee クラスのインスタンスへのポインタとして「newemployee」を宣言していますが、実際に新しい Employee を割り当てることはありません。C++ では、通常、次の 2 つの呼び出しは同等です (ただし、演​​算子のオーバーロードを使用している場合を除きますが、この場合はそうではありません)。

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

「newemployee」ポインターに何も割り当てていないため、プロセスに属さない完全にランダムなメモリ位置を逆参照することになり、オペレーティングシステムはセグメンテーション違反を通知してすぐにプロセスを強制終了します。

于 2013-02-12T04:07:14.570 に答える