[英]free(): invalid pointer error when trying to erase data from list element using free()
我正在嘗試完成具有以下要求的練習:
創建 function ft_list_remove_if
從列表中刪除所有元素,其數據與data_ref
使用cmp
進行比較,使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 指向的free_fct
將按如下方式使用:
(*cmp)(list_ptr->data, data_ref); (*free_fct)(list_ptr->data);
每次我在數據元素上調用free()
時都沒有成功。 它說“free() 無效指針中止(核心轉儲)”。 這是我的相關功能代碼。
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] != '\0' && s2[i] != '\0')
{
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 列表的第一個元素的指針。 (每個節點中的數據為“First”、“Second”、“Third”、“Fourth”、“Fifth”)。 根據 function 電話,我正在嘗試刪除“第三”。
我將不勝感激幫助理解我做錯了什么。 我可以毫無問題地更改(*begin_list)->a
的內容,但是我不知道為什么我無法釋放其中的數據。 (*begin_list)->a
不是我可以通過free()
傳遞的有效指針嗎?
是因為在我的ft_create_elem
function 中,我將“數據”直接分配給void *a
嗎?
將a
分配給數據地址會更好嗎? 我嘗試做類似a = &data
事情,但后來打印出垃圾......
問題是您正在嘗試free
列表節點中的數據,但數據本身並未由malloc
動態分配,因此您不能對其使用free
。
要解決此問題,您可以更改在列表中存儲數據的方式,以便動態分配數據,或者您可以更改 remove function 以簡單地從列表中刪除節點而不釋放數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.