2016-04-21 86 views
2

我recieving這個錯誤,當我嘗試運行此程序:流行功能鏈表,glibc的檢測雙重釋放或腐敗

* glibc的檢測* ./a.out:雙重釋放或腐敗(fasttop) :0x0000000001926070 ***

我試圖在C中創建自己的彈出功能,它給了我上面的錯誤。我不確定我出錯的地方。

struct node *pop(struct node *top, int *i) 
{ 
    struct node *new_node = top; 
    int count = 0; 

    if (new_node == NULL) { 
    return top; 
    } 

    while (new_node != NULL && (count < 1)) { 
    *i = new_node->value; 
    free(new_node); 
    new_node = new_node->next; 
    count++; 
    } 

    return new_node; 
} 
+0

你從哪裏得到錯誤?你從調試器得到什麼?你試圖找出自己的什麼? – Olaf

+0

1)有需要更新來電方'頂部'。 2)'free(new_node); new_node = new_node-> next;':發佈後不要使用。 – BLUEPIXY

回答

1
free(new_node); 
new_node = new_node->next; 

您訪問objct 後你釋放它。這會調用未定義的行爲。一旦釋放,您不得接受該對象。

而是使用一個臨時指針:

struct node *next = new_node->next; 
free(new_node); 
new_node = next; 

那是你的錯的實際原因。


然而,你的代碼是過於複雜:

  • if (new_node == NULL)是多餘的,因爲while循環已經測試了空指針new_node是相同的值top反正。
  • count會使您的循環最多隻有一次。所以你根本不需要循環。

看到這個:

struct node *pop(struct node *top, int *i) 
{ 
    if (top != NULL) { 
     struct node *next = top->next; 
     *i = top->value; 
     free(top); 
     top = next; 
    } 
    return top; 
} 

注很可能不如歸去的pop ED值,並通過一個指針的指針topstruct node **top)。這樣,你可以直接使用結果(當然,假設堆棧不是空的)。

相關問題