free()struct **指针的值

时间:2015-05-23 14:29:06

标签: c list free

我很好奇如何删除存储在列表中的结构。 我尝试了这段代码,但它给了我一个分段错误错误,我看不出错误。

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;
    }
}

2 个答案:

答案 0 :(得分:1)

请记住,br = mechanize.Browser() #Change the 2nd tuple entry to your particular user agent, you can check it in http://whatsmyuseragent.com/ br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36')] malloc应该相互对称,因为对于在堆上分配内存的给定free调用,应该有匹配的{{ 1}}调用解除分配它。

如果我们只看一下堆栈逻辑,那么push函数会分配一个新节点。您的pop函数释放一个节点,但它也分配一个新节点。所以我们在这里有一些不对称的东西,这将成为一个问题。

需要注意的另一点是,mallocfree不同。当您执行sizeof(struct Node*)时,您实际上正在检查sizeof(struct Node)类型的大小,该大小是指针的大小而不是指针。

但是,你真的不想在pop函数中分配新节点,所以你需要纠正它的堆栈逻辑。当你从像这样的单链表中弹出时,你想捕获一个指向头部节点的指针(堆栈的顶部),将头部设置为指向下一个元素(在堆栈顶部的正下方),并解放前任主管。

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

之间创建一个引用循环