C中指向结构的指针未编译的Free()函数

C中指向结构的指针未编译的Free()函数,c,pointers,free,C,Pointers,Free,我已经实现了一个linkedlist,我正在尝试创建一个函数,该函数从linkedlist的开头开始,基本上将指向结构的指针存储在curr中。然后它使用free()…不幸的是,我一直 LinkedList_头(27343,0x1000dedc0)malloc:**对象0x1007b42c0的错误:未分配要释放的指针 struct node { int data; struct node* next; }; struct node* initialize(int input){

我已经实现了一个linkedlist,我正在尝试创建一个函数,该函数从linkedlist的开头开始,基本上将指向结构的指针存储在curr中。然后它使用free()…不幸的是,我一直

LinkedList_头(27343,0x1000dedc0)malloc:**对象0x1007b42c0的错误:未分配要释放的指针

struct node {
    int data;
    struct node* next;
};

struct node* initialize(int input){
    struct node* head = (struct node*)malloc(sizeof(struct node));
    head->data = input;
    head->next = NULL;
    return head;
}

void freeing(struct node* head){
    struct node* curr = head;
    while(curr->next != NULL){
        free(curr);
    }
    free(curr);
}

代码的问题是
释放
功能不正确。函数有两种可能的失败方式

双重自由

  • 如果链表的
    下一个
    指针上有一个有效指针,则释放函数将在相同的初始指针(头)上保持循环。这将创建一个双空闲,因此您正在释放一个未分配的指针
  • //如果不是因为双重自由,它将永远循环。
    //循环永远不会继续到下一个指针,而是停留在头部。
    结构节点*curr=head;
    while(当前->下一步!=NULL){
    免费(货币);
    }
    
    从不通过链接列表进行集成

  • 代码的第二个问题是
    while
    循环将始终在头部迭代,如果不是因为双自由,循环将永远迭代
  • 问题1和2的解决方案是使while循环正确地遍历链表

    void freeing(struct node* head){
        struct node* curr = head;
        struct node* next;
        while(curr != NULL){
            next = curr->next;
            free(curr);
            curr = next;
        }
    }
    
    Freeing: 23
    Freeing: 42
    
    带测试的整个代码:

    #包括
    #包括
    结构节点{
    int数据;
    结构节点*下一步;
    };
    结构节点*初始化(int输入){
    结构节点*头=(结构节点*)malloc(sizeof(结构节点));
    头部->数据=输入;
    head->next=NULL;
    回流头;
    }
    空洞释放(结构节点*头部){
    结构节点*curr=head;
    结构节点*下一步;
    while(curr!=NULL){
    下一步=当前->下一步;
    printf(“释放:%d\n”,当前->数据);
    免费(货币);
    curr=next;
    }
    }
    int main()
    {
    结构节点*a=初始化(23);
    a->next=初始化(42);
    释放(a);
    }
    
    这就是输出,现在代码避免了双重释放并正确迭代

    void freeing(struct node* head){
        struct node* curr = head;
        struct node* next;
        while(curr != NULL){
            next = curr->next;
            free(curr);
            curr = next;
        }
    }
    
    Freeing: 23
    Freeing: 42
    

    代码的问题是
    释放
    功能不正确。函数有两种可能的失败方式

    双重自由

  • 如果链表的
    下一个
    指针上有一个有效指针,则释放函数将在相同的初始指针(头)上保持循环。这将创建一个双空闲,因此您正在释放一个未分配的指针
  • //如果不是因为双重自由,它将永远循环。
    //循环永远不会继续到下一个指针,而是停留在头部。
    结构节点*curr=head;
    while(当前->下一步!=NULL){
    免费(货币);
    }
    
    从不通过链接列表进行集成

  • 代码的第二个问题是
    while
    循环将始终在头部迭代,如果不是因为双自由,循环将永远迭代
  • 问题1和2的解决方案是使while循环正确地遍历链表

    void freeing(struct node* head){
        struct node* curr = head;
        struct node* next;
        while(curr != NULL){
            next = curr->next;
            free(curr);
            curr = next;
        }
    }
    
    Freeing: 23
    Freeing: 42
    
    带测试的整个代码:

    #包括
    #包括
    结构节点{
    int数据;
    结构节点*下一步;
    };
    结构节点*初始化(int输入){
    结构节点*头=(结构节点*)malloc(sizeof(结构节点));
    头部->数据=输入;
    head->next=NULL;
    回流头;
    }
    空洞释放(结构节点*头部){
    结构节点*curr=head;
    结构节点*下一步;
    while(curr!=NULL){
    下一步=当前->下一步;
    printf(“释放:%d\n”,当前->数据);
    免费(货币);
    curr=next;
    }
    }
    int main()
    {
    结构节点*a=初始化(23);
    a->next=初始化(42);
    释放(a);
    }
    
    这就是输出,现在代码避免了双重释放并正确迭代

    void freeing(struct node* head){
        struct node* curr = head;
        struct node* next;
        while(curr != NULL){
            next = curr->next;
            free(curr);
            curr = next;
        }
    }
    
    Freeing: 23
    Freeing: 42
    

    您的货币在循环中始终是相同的。在循环中,只要当前节点不为空,保存当前节点的“下一个”指针,释放当前节点,然后生成保存的“下一个”是新的当前节点。您引用的错误似乎不是编译器错误。在让我困惑的“不编译”旁边,你的curr在循环中总是相同的。在循环中,只要当前节点不为空,保存当前节点的“下一个”指针,释放当前节点,然后生成保存的“下一个”是新的当前节点。您引用的错误似乎不是编译器错误。旁边的“不编译”让我很困惑。