[英]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;
}
我正在嘗試實現堆棧彈出功能,但不知何故我得到了一個雙重釋放錯誤。
在函數中,我正在創建一個指向當前堆棧的臨時指針:
我究竟做錯了什么?
大概您將其稱為:
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_top
與stack_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.