【问题标题】:C- Double free error when trying to delete first node in linked listC-尝试删除链表中的第一个节点时出现双重释放错误
【发布时间】:2016-08-18 03:39:23
【问题描述】:

我正在尝试编写一个从链表中删除节点的删除函数。结构和函数定义如下:

struct dog{
    int number;
    char dog_name[NAME_LEN+1];
    char owner_last_name[NAME_LEN+1];
    char breed[NAME_LEN+1];
    struct dog *next;
};

struct dog *delete_from_list(struct dog *dogs)
{
  struct dog *cur, *prev;
  int delete_number;

  printf("\nEnter the patient number of the dog you want to delete: ");
  scanf("%d", &delete_number);

  for(cur = dogs, prev = NULL; cur != NULL && (cur->number != delete_number);
      prev = cur, cur = cur->next)
   ;

  if(cur == NULL)
  {
    printf("Dog not found.\n"); /*dog not found in list*/   
    return dogs;         
  }else if(prev==NULL)
  {
    dogs = dogs->next; /*dog now points to the second node*/ 
  }else
    prev->next = cur->next;  /*dog is in another node*/

  printf("Deleted: Dog name: %s, Breed: %s,  Owner's last name: %s\n",
           cur->dog_name, cur->breed, cur->owner_last_name);
  free(cur);
  return dogs;
} 

当我运行程序时,删除功能一直有效,直到我尝试删除第一个节点。我使用调试器发现dogs = dogs->next; 是发生错误的地方,但我不明白为什么如果我将dogs 的新头移动到第二个节点会导致问题。谁能帮帮我?

【问题讨论】:

  • 问题可能出在这个函数的调用上。在调用者中,您确定要使用此函数返回的值更新列表头吗? IE。 dogs = delete_from_list(dogs);
  • 当我调用函数时,我有一个指针*dog_list,它指向狗。这就是我所拥有的delete_from_list(dog_list);
  • 调试器.......
  • 那是你的问题。您调用该函数来删除第一个元素。该函数正确地返回了新的列表头,但调用者丢弃了它,所以它现在指向被删除的节点。改成dog_list = delete_from_list(dog_list);,问题就消失了。
  • 成功了!太感谢了! :D

标签: c pointers memory-leaks linked-list


【解决方案1】:

根据您的评论,您将其称为:

delete_from_list(dog_list);

这在删除第一个元素的情况下不起作用,因为在这种情况下delete_from_list 将返回新的列表头(以前是列表的第二个元素),但调用者中的dog_list仍将指向现在已删除的前第一个元素。解决此问题所需要做的就是将其更改为:

dog_list = delete_from_list(dog_list);

这样dog_list 将在调用者中更新,并且不再指向已删除的列表元素。

【讨论】:

    猜你喜欢
    • 2019-09-10
    • 2014-06-02
    • 2014-10-13
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多