2017-05-12 3 views
1

私はmalloc()を使って動的にメモリを割り当て、次にfree()を使ってみたときにリンクリストプログラムを試していました。関数は無限ループに入ります。free()を使用すると、C言語のプログラムが無限ループになります。

どうしてですか?

void Insert(int x, int pos) 
{ 
    struct Node *newnode = (struct Node*) malloc(sizeof(struct Node)); 
    newnode->data = x; 
    newnode->next = NULL; 
    struct Node* temp, *left, *right; 
    int i = 1; 
    temp = head; 

    if(head == NULL) 
    { 
     head = newnode; 
    } 
    else{ 
     while(i != pos - 1) 
     { 
      temp = temp->next; 
      i++; 
     } 
     newnode->next = temp->next; 
     temp->next = newnode; 
    } 
    free(newnode); 
} 
+5

['malloc()'と 'C 'のファミリの戻り値をキャストしない理由についてのこのディスカッションを参照してください。](http://stackoverflow.com/q/605845/2173917)。 –

+1

無料なので、無限ループに陥っているのですか?それはかなり奇妙です... – Silveris

+4

なぜあなたはそこで自由になりますか?ドン;後で使用したい? –

答えて

1

はあなたのリストに新たに挿入されたノードを削除して、その結果、間違った場所にfree()を使用しています。

無料()を使用する必要がありますか?

はい、malloc()を使用しているためです。あなたが動的に割り当てたメモリはあなたから割り当て解除されなければなりません。さもなければメモリリークが起こります。

次にどこでfree()を使用する必要がありますか?

あなたのコードの場所では、あなたのリストはもう必要ありません。たとえば、main()の末尾に入力します。


無関係が、あなたのinsert()を見ることで、私はheadができ、避けるべきであるグローバル変数、であることがわかります。これをパラメータとしてリスト関数に渡し、この変数をグローバル化しない方が良い方法です。もしあなたが望むなら、このlist'sのコードを見てください。これは完全にコメントされていて、私が学んだものでした。


Do I cast the result of malloc?いいえ!

関連する問題