2015-05-23 92 views
-5

我很好奇如何刪除存儲在列表中的結構。 我試過這段代碼,但它給了我一個分段錯誤錯誤,我看不到錯誤。free()struct **指針的值

typedef struct double_stack_head_struct 
{ 
    struct double_stack_head_struct* tail; 
    double       value; 
} double_stack_head; 

typedef struct double_stack_struct // the structure containing the state of a stack 
{ 
    int    size;  // size of stack 
    double_stack_head* head; 
} double_stack; 

void push_double_stack(double_stack* stack, double value) 
{ 
    double_stack_head* new_head = malloc(sizeof(double_stack_head)); 
    if(new_head != NULL) { 
     new_head->tail = stack->head; 
     new_head->value = value; 

     stack->head = new_head; 
     stack->size += 1; 
    } 
} 

int pop_double_stack(double_stack* stack, double* value) 
{ 
    if(empty_double_stack(stack)) { 
     return false; 
    } else { 
     *value = stack->head->value; 
     free(stack->head); 
     stack->size -= 1; 
     stack->head = malloc(sizeof(stack->head)); 
     stack->head = stack->head->tail; 
     return true; 
    } 
} 
+1

你的彈出函數調用malloc,然後立即覆蓋保存的指針。這會泄漏,也可能是崩潰的原因(如果其他值不是malloc的有效指針)。 –

+1

彈出後分配一個新頭也沒有多大意義。 –

回答

0
don't do this!! 

    stack->head = malloc(sizeof(stack->head)); 

使用本:

stack->head = (double_stack_head *)malloc(sizeof(double_stack_head)); 

還要在下面的函數

void push_double_stack(double_stack* stack, double value) 

它double_stack之間創建一個參考週期的關注和double_stack_struct

+0

[在* C *中拋出'malloc'的返回不是一個好主意](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)和['' sizeof(* stack-> head);'](http://stackoverflow.com/questions/17258647/why-is-it-safer-to-use-sizeofpointer-in-malloc)也明顯提及類型。 – ryanpattison

1

記住mallocfree應該相互對稱,因爲對於給定的malloc調用來分配堆上的內存,應該有匹配的free調用來釋放它。

如果我們只看一眼你的堆棧邏輯,你的推送函數會分配一個新的節點。你的pop函數釋放一個節點,但它也分配一個新的節點。所以我們在這裏有一些不對稱的東西,這將是一個問題。

另一件需要注意的是sizeof(struct Node*)sizeof(struct Node)不同。當你做sizeof(stack->head)時,你實際上檢查了size->head這個類型的大小,它是指針的大小而不是指針。

但是,你並不是真的想在彈出函數中分配新節點,所以它需要你的堆棧邏輯來糾正。當你從這樣的單鏈表中彈出時,你需要捕獲一個指向頭部節點(堆棧頂部)的指針,將頭部指向下一個元素(位於堆棧頂部下方),並釋放那個前頭。

+0

謝謝我犯了一個小錯誤,但你是對的。我洗了澡,發現我必須複製我沒有的「尾巴」。代碼現在工作正常。 –