双重免费错误Stack pop实现

时间:2014-12-19 15:01:10

标签: c stack pop

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(指向堆栈顶部的元素)
  • 然后我得到双重免费错误

我做错了什么?

3 个答案:

答案 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_toptemp->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