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

标签 c linked-list free

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

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

关于c - 我是否以正确的方式释放这个链表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35135690/

相关文章:

c - 如何找到作为参数传递给 c 的整数数组的长度?

swift - 如何使用 Swift 检测链表中的循环/周期

c - 如何在 C 中置换(洗牌)动态/链表

使用链表的 malloc() 和 free 的正确方法

c - 传递指针的free() 'know'如何有效?

c - 何时/如何释放从函数返回的指针

c - 当我们覆盖 C 中的 union 字段时会发生什么?

C:使用 fread()/fgets() 而不是 fgetc() 逐行读取文本文件(具有可变长度行)( block I/O 与字符 I/O)

用C计算复数的abs值

c - C 中的列表实现