C语言ft_lstdelone的参数void (*del)(void*)含义是什么?
void (*del)(void*)参数含义解释 语法本质
这个参数是C语言中的函数指针,各部分语义拆解如下:
del是变量名,存储你传入的函数的入口地址- 开头的
void表示该指针指向的函数执行后没有返回值 - 括号内的
void*表示该指针指向的函数仅接收一个void*类型的入参,对应链表节点content字段的类型
设计逻辑
链表节点t_list的content字段是通用无类型指针,可以存储任意类型的数据:可能是普通字符串、自定义结构体、甚至是另一个链表等,不同类型的数据的内存释放逻辑完全不同。
把释放函数作为参数传入,ft_lstdelone不需要关心节点存储的数据类型,只要调用你传入的del函数就能正确释放content对应的内存,函数的通用性大幅提升。
用法示例
1. 自定义对应数据类型的释放函数
如果你的节点存储的是自定义结构体:
// 自定义结构体示例 typedef struct s_student { char *stu_name; int *stu_score; } t_student; // 对应结构体的释放函数 void del_student(void *content) { t_student *stu = (t_student *)content; free(stu->stu_name); // 先释放结构体内部申请的堆内存 free(stu->stu_score); free(stu); // 最后释放结构体本身 }
2. 调用ft_lstdelone时直接传入函数名
函数名本身就是函数的入口地址,直接作为参数传递即可:
t_list *node = /* 你要删除的节点指针 */; ft_lstdelone(node, del_student);
ft_lstdelone内部实现逻辑参考
你写函数的时候按照这个逻辑实现即可:
void ft_lstdelone(t_list *lst, void (*del)(void*)) { // 先做空指针判断,避免访问非法内存崩溃 if (!lst || !del) return; // 调用传入的del函数释放节点内容内存 del(lst->content); // 释放节点本身的内存 free(lst); }
内容的提问来源于stack exchange,提问作者Miguel M
相关产品推荐
相关产品推荐

