以下の点で困っています。
void BuildList(cs460hwp hw)
{
FILE* fp;
fp = fopen("HW2input.dat", "r");
if(fp == NULL)
{
printf("Couldn't open the file.");
return;
}
int numStudents;
int i;
bool success;
char* dueDate = malloc(9*sizeof(char));
char* course = malloc(7*sizeof(char));
char* wsuid = malloc(9*sizeof(char));
char* subDate = malloc(9*sizeof(char));
double points1 = 0;
double points2 = 0;
cs460hwp stuInsert = NULL;
fscanf(fp, "%d", &numStudents);
fscanf(fp, "%s", dueDate);
for(i = 0; i < numStudents; i++)
{
stuInsert = malloc(sizeof(cs460hwp));
fscanf(fp, "%s %s %s %lf", course, wsuid, subDate, &points1);
strcpy(stuInsert->course, course);
strcpy(stuInsert->wsuid, wsuid);
strcpy(stuInsert->subdate, subDate);
stuInsert->points1 = points1;
stuInsert->points2 = CalculatePoints(dueDate, subDate, points1);
stuInsert->nextPtr = NULL;
if(hw == NULL)
{
hw = stuInsert;
}
else
{
stuInsert->nextPtr = hw;
hw = stuInsert;
}
}
free(course);
free(wsuid);
free(subDate);
free(dueDate);
PrintGrades(hw);
fclose(fp);
}
struct hwpoints
{
char course[7];
char wsuid[9];
char subdate[9];
double points1;
double points2;
struct hwpoints *nextPtr;
};
typedef struct hwpoints *cs460hwp;
ここでの私の目標は、すべてのエントリをリストの一番上に挿入することです。ただし、nextPtr (else 句など) に何かを割り当てようとすると、ガベージ値でいっぱいになります。それらはほとんど古いデータの切り捨てられたバージョンであり、ヒープから取得されていると私は信じています。私は(たくさん)読んできましたが、この特定の問題に関するアドバイスを見つけるのに苦労しています。
nextPtr は常にジャンクになり、nextPtr->nextPtr は segfault を引き起こします。ループの反復ごとに。hw は問題ありませんが、そのポインター値は適切に更新されません。
構造体のメモリ割り当てを関数に移動しようとしても、同じ (または同様の) 問題が発生しました。
誰かが私を正しい方向に向けることができますか?