2016-07-09 3 views
0

次のコードを実行すると、無限のループ結果が得られます。しかし、insert関数のフリーポインタ行、つまりfree(ptr)free(ptrnext)をコメントアウトすると正しく動作します。なぜ誰がそれを説明できるのですか?free()を使用して無限ループに至るのはなぜですか

私は、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); 
} 
+1

あなたがあるノードの割り当てを解除していますあなたのリンクされたリストにまだあります。 – Barmar

+1

リストに追加するときに何か解放する必要があると思われるのはなぜですか?それを削除しないのはなぜですか? – Barmar

+0

ありがとう@Barmar。私はあなたの意見を持っています。 – Anonymous

答えて

1

私は、次のコードを実行すると、それは私に無限ループの結果を提供します。しかし、私が挿入機能、すなわちfree(ptr)free(ptrnext)の空きポインタ行をコメントアウトすると、正常に動作します。

  • これは未定義の動作です。 free()の機能をコメントしていない場合)

  • メモリを解放したら、もう使用しないことを覚えておく必要があります。

注:ポインタがまたは解放した後、同じブロックを指していない場合があります、それは未定義の動作です

  • したいない限り、ポインタを解放しません。 destroyまたはdeleteノード。

  • ノードを削除しないので、insertの機能でfree()を使用しないでください。それとは別に


    、私はプログラムの終了時に割り当て解除メモリに任意の関数が表示されません。

  • 必ずdelete()機能を使用して最後に割り当て解除割り当てられたメモリに確認してください。

  • はここmain()機能の終わりに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 
    } 
    
  • コールそれの典型的な実装だか、deleteにリスト全体を望むとき

関連する問題