簡體   English   中英

Double free error堆棧彈出實現

[英]Double free error Stack pop Implementation

typedef struct StackElement{    

    struct StackElement* below;    
    float value;

} sStackElement;

typedef struct StackElement* stack_top; 

float stack_pop(stack_top *stacktop)                                   
{
     sStackElement* temp = (sStackElement *) stacktop; 
     if(stacktop==NULL){
         return NAN;
     }    
     float temp2 = temp->value;                                
     stacktop = &(temp->below);                      

     free(temp);                                     

     return temp2;
}

我正在嘗試實現堆棧彈出功能,但不知何故我得到了一個雙重釋放錯誤。

在函數中,我正在創建一個指向當前堆棧的臨時指針:

  • 然后我檢查指針是否為Null。
  • 然后我將頂部指向堆棧中的第二個元素。
  • 然后我釋放temp(指向堆棧頂部的元素)
  • 然后我得到雙重免費錯誤

我究竟做錯了什么?

大概您將其稱為:

float value = stack_pop( &realstacktop );

// do more with stacktop

問題是:

float stack_pop(stack_top *stacktop)                                   
{
   // ...
        stacktop = &(temp->below);                      
   // ...
}

無助於改變realstacktop你傳入呼叫。 stack_pop()再次,你會提領-免費-同樣的頂級項目。

你想說:

*stacktop = temp->below;

您的stack_topstack_top temp->below相同,它們都是sStackElement指針。 所以線

stacktop = &(temp->below);

實際上是將sStackElement **分配給sStackElement * ,而不是預期的。 因此,請刪除引用運算符& ,如果編譯器抱怨,請執行強制類型轉換。

// called via: float value = stack_pop( &realstacktop );

#include <stdlib.h>
#define  NAN (0.0f) // only here for my compiler

struct StackElement
{
    struct StackElement* below;
    float value;
};



float stack_pop(struct StackElement **ppStacktop)
{
     if(*ppStacktop==NULL)
     { // then stack empty
         return NAN;
     }

     // implied else, stack not empty

        // save ptr to current stack top
     struct StackElement* temp = *ppStacktop;
        // retrieve value from current stack top
     float temp2 = temp->value;
        // pop current stack top entry
     *ppStacktop = temp->below;

     free(temp); // release 'old' stack top

     return temp2; // return retrieved value
} // end function: stack_pop

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM