C语言 free():当尝试使用free()从列表元素中删除数据时,无效指针错误



我正在尝试完成以下要求的练习:

  • 创建函数ft_list_remove_if,从列表中删除所有元素用cmpdata_ref比较,使cmp返回0。

  • 要擦除的元素中的数据应该使用free_fct

    释放
  • 原型应该是这样的:

    void ft_list_remove_if(t_list **begin_list, void *data_ref, int (*cmp)(),
    void (*free_fct)(void *));
    
  • cmpfree_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函数,简单地从列表中删除节点,而不释放数据。

相关内容

  • 没有找到相关文章

最新更新