下面是我的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
是函数内部的局部变量,您需要将其作为引用传递(即作为指针指向指针)。
当最后一个节点被弹出时,函数释放了它,但是调用它的代码仍然拥有指针。所以下一个调用将是一个指向释放内存的指针,这将导致未定义的行为当指针被访问时。未定义的行为常常导致崩溃。