我在以下方面遇到了一些问题:
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仍然很好,但它的指针值永远不会正确更新。
即使我试图将结构的内存分配移到函数中,我也遇到了相同(或类似)的问题。
有人能指点我正确的方向吗?
最佳答案
两个问题。
1)如pb2q所述,您正在传递一个指向结构的指针,并尝试分配arg指向的内容。编译器允许这样做,但它在函数之外对您没有任何帮助。在您的情况下,如果:
void main()
{
cs460hwp hw = NULL;
BuildList(hw);
return;
}
是你的全部功能。我不知道这个任务,所以你需要弄清楚你是否能接受。
2)更大的问题是:
stuInsert = malloc(sizeof(cs460hwp));
你有没有查过cs460hwp的尺寸?四点了。您分配的内存足够指针的大小,而不是结构的大小。我很确定这不是你想做的,这是你的死因。只是踢,换成malloc(100)看看你的问题是否消失。如果是这样的话,你只需要弄清楚你真正想要的尺寸。;)