我的pop函数中无法释放/释放空间?

时间:2013-04-23 03:01:48

标签: c segmentation-fault free pop

这是我的pop代码:

int pop (struct_of_ints *head_node){
int val;
if (head_node == NULL){
    fprintf(stderr, "Empty stack.\n");
    return -1;
}
else {
    struct_of_ints *curr;
    struct_of_ints *prev;
    curr = head_node;
    prev = NULL;

        while (curr->next != NULL) {
            prev = curr;
            curr = curr->next;
        }

        val = curr->value;

        if (prev == NULL) 
            head_node = NULL;
    else 
            prev->next = curr->next;
        free(curr)
        return val;


}

}

然而,当我尝试释放(curr)时,我得到一个分段错误,当我运行valgrind时,我收到“无效的free()/ delete / delete []”之类的消息,“地址0x51c1f60是一个块内的16个字节大小32免费“和”无效读取大小8“......我不知道什么是错的。如果有人可以提供帮助,我会很感激。谢谢!

2 个答案:

答案 0 :(得分:3)

您正在函数中传递指针* head_node,它正在通过值传递。要更新* head_node,请尝试传递** head_node,并将代码更改为::

int pop (struct_of_ints **head_node)
{
    int val;
    if (*head_node == NULL)
    {
        fprintf(stderr, "Empty stack.\n");
        return -1;
    }
    else 
    {
        struct_of_ints *curr;
        struct_of_ints *prev;
        curr = *head_node;
        prev = NULL;
        while (curr->next != NULL) 
        {
            prev = curr;
            curr = curr->next;
        }

        val = curr->value;

        if (prev == NULL) 
            *head_node = NULL;
        else 
            prev->next = curr->next;
        free(curr)
        return val;
    }
}

答案 1 :(得分:2)

我的猜测是,只有在弹出所有节点后才会发生这种情况,然后尝试再弹出一个节点。这是因为您在函数内部对head_node的赋值不会传播到调用函数的代码。 head_node是函数内部的局部变量,您需要将其作为引用传递(即作为指针的指针)。

当弹出最后一个节点时会发生什么,该函数是free,但是调用它的代码仍然会有指针。因此,下一次调用将使用指向free'd内存的指针,当访问该指针时,该指针将导致未定义的行为。未定义的行为通常会导致崩溃。