2017-05-12 36 views
1

我試圖出在C()的鏈接列表程序,我使用malloc動態分配存儲器,然後當我嘗試使用免費()在的端部函數,程序運行到無限循環。程序運行到當我用無限循環免費()

這是怎麼發生的?

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

[請參閱此討論關於爲什麼不在'C'中投射'malloc()'和家族的返回值。](http://stackoverflow.com/q/605845/2173917)。 –

+1

你確定它因爲免費而陷入無限循環嗎?這很奇怪... – Silveris

+4

爲什麼你在那裏免費?不要,你想在以後使用他們嗎? –

回答

1

你在錯誤的地方使用free(),導致刪除新插入的節點列表。

我應該在所有使用免費的()?

是的,因爲您使用的是malloc()。您動態分配的內存應該由您取消分配,否則會發生內存泄漏。

那麼我應該在哪裏使用免費()呢?

代替你的代碼,你不需要你的列表了。例如,在您的main()結束時。


無關,而是看你的insert(),我可以看到,head是一個全局變量,這應該是可以避免的,如果能。將它作爲參數傳遞給你的列表函數,並且使這個變量不是全局的是一個更好的方法。如果你想,走在這list's代碼,這是完全註釋,是我用來學習的一個看看。


Do I cast the result of malloc?不!