我使用双向链表在C中构建了一个堆栈结构,当弹出列表的最后一个元素时,我遇到了一个段错误。这是pop方法和一些相关的全局变量:
typedef struct node {
int value;
struct node *prev;
struct node *next;
} node;
node *head = NULL;
node *tail = NULL;
int stackSize = 0;
int removeFromStack(){
node *tempNode = head;
if(stackSize <= 0){
emptyStackError();
}
int val = head->value;
if(stackSize == 1){
head = NULL; //Segfaults here
tail = NULL;
}
else{
head = head->next;
head->prev = NULL;
}
free(tempNode);
stackSize--;
return val;
}
很明显,我不应该只是将头部和尾部设置为null。我应该做什么呢?
答案 0 :(得分:1)
错误可能不在你说的地方。您只需为指针赋值。我的猜测是它来自上面的两行。
在:
int val = head->value;
请添加:
assert(head != NULL && "Oops, the counter is messed up");
并尝试再次运行您的代码。
如果断言触发,则跟踪stackSize
的所有使用情况。如果不是,则不一定意味着指针不是随机的,或者指向解除分配的空间。在此函数中注释head->value
以外的所有内容。然后尝试创建一个列表,按下一个元素,然后尝试调用removeFromStack
。然后尝试按两个元素,弹出一个元素并再次尝试removeFromStack
。
我的猜测是你的计数器在另一个函数的某个地方被破坏了。