簡體   English   中英

free():嘗試使用 free() 從列表元素中刪除數據時出現無效指針錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM