c语言 - 不能在我的 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的无效读取"…我不知道怎么了。如果有人能帮忙,我会很感激的。谢谢!

您正在传递指针*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;
    }
}

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

当最后一个节点被弹出时,函数释放了它,但是调用它的代码仍然拥有指针。所以下一个调用将是一个指向释放内存的指针,这将导致未定义的行为当指针被访问时。未定义的行为常常导致崩溃。

最新更新