为什么使用free()导致无限循环

匿名的

当我运行以下代码时,它给了我无限循环的结果。但是,如果我注释掉insert函数ie中的空闲指针行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);
}
切鲁比

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

  • 这是未定义的行为(当您不注释free()功能时)

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

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

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

  • 因此,请勿free()insert函数中使用,因为您不会删除任何节点。


  • 除此之外,在程序结束时我看不到任何用于释放内存的函数

  • 始终确保使用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整个列表调用它

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么这会导致无限循环[SICP]?

为什么会导致无限循环?

为什么尝试使用for循环上升到2,147,483,647会导致无限循环?

为什么这个while循环会导致无限循环?

为什么在bash管道上使用`yes'不会*导致无限循环?

为什么在此bash脚本中使用参数移位会导致无限循环?

为什么从无限循环切换到TimerTask会导致CPU使用率下降?

为什么无限循环在使用Promela和Spin进行模型检查时不会导致错误?

为什么使用无限for循环将无符号整数相加会导致错误的结果?

为什么 std::lock() 在使用我自己的 unique_lock 对象时会导致无限循环?

为什么使用 CDI 进行自注入不会导致无限循环?

为什么 useFetcher 会导致重新渲染无限循环?

为什么这个 setState 会导致无限循环?

Python,为什么i = + 1不会导致无限循环?

为什么可选的快速枚举会导致无限循环?

为什么不重定向会导致无限循环?

为什么这段代码会导致无限循环

为什么`data`导致无限循环而`newtype`不是

为什么此方法会导致无限循环?

为什么facebook javascript登录代码会导致无限循环?

为什么这段代码会导致无限循环?

为什么非整数输入会导致无限循环?

为什么setState导致我的React应用进入无限循环?

为什么这会导致字符无限循环而不是双倍?

为什么无限循环?

无限循环。为什么?

为什么是for(;;); 无限循环?

为什么循环是无限的?

使用r8寄存器作为循环计数器会导致无限循环-为什么?