我是否以正确的方式释放了这个链表?

Am I freeing this linked list in the correct manner?

这是释放链表的正确方法吗?我有以下结构:

struct Courses{
    char *courseName;
    int creditValue;
    Courses *next;
}Courses;

struct Student{
    char *name;
    int age;
    Courses *list;  //First course (node)
}Student;

这是我的免费功能:

void freeStudent(Student *student){
    struct Courses *tmp = student->list;

    while(tmp != NULL){
        free(tmp->name);
        free(tmp);
        tmp = tmp->next;
    }
}

我订购的免费功能错了吗?我应该在释放 tmp 之前做 tmp = tmp->next 吗?

是的,错了

free(tmp);
tmp = tmp->next;

在你释放 tmp 之后,它变成了一个悬挂指针(这就是为什么有些人会把它设置为 NULL)。您不应该尝试像这样访问它 tmp->next

我会推荐这个免费版本

void freeStudent(Student *student){
    struct Courses *tmp = student->list, *pre;

    while(tmp != NULL){
        free(tmp->name);
        pre = tmp->next;
        free(tmp);
        tmp = pre;
    }
}