这是我的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“......我不知道什么是错的。如果有人可以提供帮助,我会很感激。谢谢!
答案 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内存的指针,当访问该指针时,该指针将导致未定义的行为。未定义的行为通常会导致崩溃。