我正在尝试完成以下要求的练习:
-
创建函数
ft_list_remove_if
,从列表中删除所有元素用cmp
与data_ref
比较,使cmp
返回0。 -
要擦除的元素中的数据应该使用
释放free_fct
-
原型应该是这样的:
void ft_list_remove_if(t_list **begin_list, void *data_ref, int (*cmp)(), void (*free_fct)(void *));
-
cmp
和free_fct
所指向的功能将使用如下:(*cmp)(list_ptr->data, data_ref); (*free_fct)(list_ptr->data);
每次在数据元素上调用free()
都没有成功。它说'free()无效指针Aborted (core dump)'。以下是相关函数的代码。
typedef struct llist {
void *a;
struct llist *next;
} t_list;
t_list *ft_create_elem(void *data)
{
t_list *ptr;
ptr = NULL;
ptr = malloc(sizeof(t_list));
ptr-> a = data;
ptr-> next = NULL; /*NOTE I HAVE ANOTHER FUNCTION THAT LINKS NEWLY CREATED ELEMENT TO PREV*/
return (ptr);
}
int ft_strcmp(char *s1, char *s2)
{
int i;
i = 0;
while (s1[i] == s2[i] && s1[i] != ' ' && s2[i] != ' ')
{
i++;
}
return (s1[i] - s2[i]);
}
void *ft_list_remove_if(t_list **begin_list, void *data_ref, int (*cmp)(), void (*free_fct)(void *))
{
while(*begin_list)
{
if (cmp(((*begin_list)->a), data_ref) == 0)
free_fct((*begin_list)->a);
*begin_list = (*begin_list)->next;
}
}
我这样称呼它:ft_list_remove_if(&toprint, "Third", ft_strcmp, free);
。变量toprint
是指向我想要导航的5个列表中的第一个元素的指针。(每个节点的数据为"第一"、"第二"、"第三"、"第四"、"第五")。根据函数调用,我正在尝试删除"Third"
我希望你能帮助我理解我做错了什么。我能够毫无问题地更改(*begin_list)->a
的内容,但我不知道为什么我无法释放那里的数据。(*begin_list)->a
不是一个有效的指针,我可以通过free()
吗?
是否因为在我的ft_create_elem
函数中,我将"数据"直接分配给void *a
?
我是否最好将a
分配给数据的地址?我试着做一些像a = &data
,但随后打印垃圾…
问题是您正在尝试free
列表节点中的数据,但数据本身不是由malloc
动态分配的,因此您不能在其上使用free
。
要解决这个问题,您可以更改在列表中存储数据的方式,以便动态分配数据,或者您可以更改remove函数,简单地从列表中删除节点,而不释放数据。