【问题标题】:How a free sucession of pointers?如何免费继承指针?
【发布时间】:2021-03-20 11:19:11
【问题描述】:

所以我有一个内部有两个指针标签的结构:next,它指向一串其他结构(都通过指针链接它们的下一个字段),另一个指向链中的最后一个结构。我正在尝试释放它们,但不知何故,由于无效的免费,我不断得到核心转储。我是一个新的 C 编码器。有什么我在做的事情显然是错误的吗?

void free_if(myTik *the){


    while(the->endif != NULL){
        myTik *eh;
        eh = the->next;
        the->next = the->next->next;
        free(eh);
    
    }
   
}

【问题讨论】:

  • 如果the->next为NULL,那么the->next = the->next->next;有问题。
  • 发布的代码太少。 myTik 是如何定义的?链表是如何构造的?另外还不清楚这个函数应该做什么......它被称为free_**if**,这表明有条件的免费但没有if语句。
  • 不使用调试器。不遵循/详细说明您的测试/调试策略和结果,(它是否适用于空列表?它适用于一个列表吗?两个?三个?
  • 作为新用户,您应该阅读How to Ask。具体来说,您的代码不是minimal reproducible example,因此其他人无法重现。重现问题通常是解决问题的必要步骤。

标签: c pointers runtime-error malloc free


【解决方案1】:

我认为你的逻辑有错误。

您检查“当前节点”是否为 NULL,但删除当前节点的“下一个”。

the->next = the->next->next;

所以上面的代码可能会出错

node(current) -> NULL(因为->next是NULL,所以->next->next会破坏运行时错误)

最好使用 'dummy header' 来擦除单向链表中的全部节点

void free_if(node header){

  while(header->head->next != NULL){
    node *eh;
    eh = header->head;
    header->head = eh->next;
    free(eh);
  }

  //if escape while loop, you get this
  //HEADER(dummy) -> node -> NULL;

  so, just free it
  free(header->head);

}

【讨论】:

    【解决方案2】:

    您只想逐个节点地处理您的链表,保存当前指针的副本(要删除的受害者)并在释放内存之前推进您用来迭代列表的指针受害节点。 (你很接近,你只是在里面扔了太多->next

    释放所有节点的正常遍历是:

    void free_if (myTik *the)
    {
        while (the != NULL) {
            myTik *victim = the;
            
            the = the->next;
            free (victim);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 2016-09-02
      • 1970-01-01
      相关资源
      最近更新 更多