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;
}
我正在尝试实现堆栈弹出功能,但不知怎的,我得到了双重免费错误。
在函数中,我正在创建一个指向当前堆栈的临时指针:
我做错了什么?
答案 0 :(得分:2)
大概你称之为:
float value = stack_pop( &realstacktop );
// do more with stacktop
问题在于:
float stack_pop(stack_top *stacktop)
{
// ...
stacktop = &(temp->below);
// ...
}
更改您传入的realstacktop
。再次致电stack_pop()
,您将取消引用 - 并免费 - 同一顶级项目。
你想说:
*stacktop = temp->below;
答案 1 :(得分:1)
您的stack_top
与temp->below
的类型相同 - 它们都是指向sStackElement
的指针。这一行
stacktop = &(temp->below);
实际上是将sStackElement **
分配给sStackElement *
,这不是预期的。因此,删除引用运算符&
,并在编译器抱怨时执行强制转换。
答案 2 :(得分:0)
// 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