为什么C语言空链表销毁函数free内存后未返回0
代码问题分析
核心问题是对free函数的行为认知错误,导致判断逻辑完全不成立,具体如下:
- C语言标准库中的
free()函数只会释放指针指向的堆内存空间,不会修改指针变量本身的存储值。代码中调用free(ll)后,作为函数局部变量的ll仍然保存着释放前的内存地址,不会自动变成NULL,因此第二个if (ll == NULL)的判断条件永远为假,永远无法进入该分支返回0,最终只会执行函数末尾的return -1。 - 额外逻辑问题:链表为空时执行完
free(ll)就已经完成了销毁动作,不需要额外通过判断指针是否为NULL来确认销毁结果,该判断完全冗余且错误。
修复方案
直接删除错误的指针判断即可,修复后代码如下:
int ll_destroy(struct linked_list *ll) { if (ll_length(ll) == 0){ free(ll); return 0; } return -1; }
注意:当前实现释放链表结构后,函数外部传入的原链表指针会变成野指针。如果需要同时将外部指针置为NULL,需要将函数参数修改为二级指针
struct linked_list **ll,释放后手动执行*ll = NULL赋值。
内容的提问来源于stack exchange,提问作者Max Aquino
相关产品推荐
相关产品推荐

