【问题标题】:Why does using free() lead to infinite looping为什么使用 free() 会导致无限循环
【发布时间】:2016-07-09 11:03:16
【问题描述】:

当我运行以下代码时,它给了我一个无限循环的结果。但是,如果我注释掉insert 函数中的空闲指针行,即free(ptr)free(ptrnext),那么它工作正常。谁能解释一下为什么会这样?

我很确定 print 和 takeInput 工作正常,因此可以忽略。

#include<stdio.h>
#include<stdlib.h>

typedef struct Nodes{
    struct Nodes * next;
    int val;
}Node; 

//Function to create a linked list
Node * takeInput(){
    int data;
    Node *start =NULL ;
    Node *tail=NULL;

    printf("Enter the number of nodes"); 
    int num,i;
    scanf("%d",&num);
    for(i=1;i<=num;i++){
        if(start==NULL){
            start=malloc(sizeof(Node));
            puts("Enter data");
            scanf("%d",&data);
            start->val=data;
            start->next=NULL;
            tail=start;
        }
        else{
            Node * ptr = malloc(sizeof(Node));
            puts("Enter data" );
            scanf("%d",&data);
            ptr->val=data;
            tail->next=ptr;
            tail=tail->next;
        }   

    }   
    tail->next=NULL;        
    return start;
}

//Function to print
void print(Node * head){
    Node*ptr=head;
    while(ptr!=NULL){
        printf("%d->",ptr->val);
        ptr=ptr->next;
    }
}

//Function to insert a node in given linked list 
Node * insert(Node *start){
    int i,data;

    puts("Enter pos");
    scanf("%d",&i);

    puts("Enter data");
    scanf("%d",&data);

    Node * ptr=malloc(sizeof(Node));    
    ptr->val=data;
    ptr->next=NULL;

    if(i==1){

        ptr->next=start;
        start=ptr;

        free(ptr);  

    }
    else{
        Node * ptrnext=start;
        while(i!=1){
            ptrnext=ptrnext->next;
            i--;
        }

        ptr->next=ptrnext->next;
        ptrnext->next=ptr;

        free(ptr);
        free(ptrnext);

    }
    return start;
}

int main(void){
    Node * start =takeInput();  
    start=insert(start);
    print(start);
}

【问题讨论】:

  • 您正在释放仍在链接列表中的节点。
  • 为什么你认为在添加到列表时需要释放任何东西,而不是从中删除?
  • 谢谢@Barmar。我明白你的意思了。
  • 尤其是在序列中:start = ptr; free(ptr); return start; 其中insert 返回一个已经被释放的指针

标签: c pointers linked-list free


【解决方案1】:

当我运行以下代码时,它给了我一个无限循环的结果。但是,如果我注释掉插入函数中的空闲指针行,即free(ptr)free(ptrnext),那么它可以正常工作。

  • 这是未定义的行为(当您不评论 free() 函数时)

  • 一旦你释放了内存,你必须记住不要再使用它了。

注意:指针在释放后可能指向同一个块,也可能不指向同一个块,这是未定义的行为

  • 所以不要释放指针,除非你想destroydelete 节点。

  • 所以不要在insert 函数中使用free(),因为您不会删除任何节点。


  • 除此之外,我没有看到任何函数可以在程序结束时释放内存。

  • 始终确保在最后使用delete() 函数释放分配的内存

  • 这是delete函数的典型实现

    void delete(Node* start)
    {
         Node* temporary = NULL;
         while(start != NULL)
         {
             temporary = start->next; //saving next node address
             free(start); //freeing current node
             start = temporary; //assigning start with next node address
         }
    
         printf("successfully destroyed the list!"); //function exit message
    }
    
  • main()函数结束时调用它,或者当你想delete整个列表时调用它

【讨论】:

    猜你喜欢
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 2012-09-27
    相关资源
    最近更新 更多