C语言:如何正确释放malloc分配的pomiar结构体链表?
链表释放的正确姿势:必须逐个遍历释放!
当然得遍历整个链表逐个释放每个节点啦!你的每个pomiar节点都是通过malloc()独立分配的内存块,它们之间只是用指针做了链接——如果只释放头节点,剩下的所有节点都会变成内存泄漏,系统没法自动回收这些内存,直到程序退出。
具体操作步骤
核心思路是:先保存下一个节点的地址,再释放当前节点——因为一旦你free()了当前节点,就不能再访问它的nast指针了(这属于未定义行为,可能导致程序崩溃)。
基础版实现(传递头指针)
void zwolnij_liste(struct pomiar *glowa) { struct pomiar *biezacy_wezel = glowa; struct pomiar *nastepny_wezel; // 遍历直到所有节点都被释放 while (biezacy_wezel != NULL) { // 第一步:先把下一个节点的地址存起来 nastepny_wezel = biezacy_wezel->nast; // 第二步:释放当前节点的内存 free(biezacy_wezel); // 第三步:移动到下一个节点继续处理 biezacy_wezel = nastepny_wezel; } }
进阶版(传递二级指针,避免野指针)
如果你的头指针是在调用函数里维护的,建议用二级指针作为参数——这样释放完所有节点后,可以直接把原头指针置空,防止后续代码不小心访问已经释放的内存(野指针问题):
void zwolnij_liste(struct pomiar **glowa) { struct pomiar *biezacy_wezel = *glowa; struct pomiar *nastepny_wezel; while (biezacy_wezel != NULL) { nastepny_wezel = biezacy_wezel->nast; free(biezacy_wezel); biezacy_wezel = nastepny_wezel; } // 把原头指针置空,彻底避免野指针 *glowa = NULL; }
调用方式
- 基础版:
zwolnij_liste(moja_lista);之后记得手动把moja_lista设为NULL - 进阶版:
zwolnij_liste(&moja_lista);函数内部会自动帮你把moja_lista置空
关键注意点
绝对不能直接这样写:
// 错误示例! while (glowa != NULL) { free(glowa); glowa = glowa->nast; // free之后访问glowa的成员是未定义行为! }
因为free(glowa)之后,glowa指向的内存已经被系统回收,再访问glowa->nast会导致不可预测的错误(比如程序崩溃、出现奇怪的内存值)。
内容的提问来源于stack exchange,提问作者Ania
相关产品推荐
相关产品推荐

