【问题标题】:Am I freeing this linked list in the correct manner?我是否以正确的方式释放了这个链表?
【发布时间】:2026-02-23 07:45:01
【问题描述】:

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

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 吗?

【问题讨论】:

    标签: c linked-list free


    【解决方案1】:

    是的,这是错误的

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

    【讨论】:

      最近更新 更多