我在以下方面遇到了一些问题:

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)看看你的问题是否消失。如果是这样的话,你只需要弄清楚你真正想要的尺寸。;)

10-08 07:11