我的教授给了我们一个编写代码,她给我们的部分代码是打印我们放入堆栈的内容。但是,正如我已经让她知道的那样,它无法正确打印堆栈中的内容。它抛出一个错误,这意味着我在堆栈中打印信息后,它会尝试继续,因为它实际上并没有清空堆栈。我的问题是,任何人都有解决方案吗?这是她给我们的代码片段:
void print_stack(stack s)
{
if (!is_empty(s))
{
printf(“%d\n”, s->data);
print_stack(s->next);
}
}
它正确地打印了堆栈中的数字,但随后在PuTTY中引发了分段错误,并在Visual Studio中引发了异常。将这些数字(1,2,3)推入堆栈后,它会打印出来:
3 2 1 -1991643855
分段故障(核心转储)
在Visual Studio中,它只是说:
抛出未处理的异常:读取访问冲突。
s是0xCCCCCCCC。
提前谢谢。
推送代码是:
void push(stack*s, int num)
{
stack temp;
temp = (stack)malloc(sizeof(struct stacknode));
temp->data = num;
temp->next = *s;
*s = temp;
}
答案 0 :(得分:0)
在main()中初始化堆栈时,是否将其初始化为NULL?
看起来它是未初始化的,并且设置为0xCCCCCCCC,非常随机。因为它不是从初始化为null的堆栈开始,所以is_empty()调用将不会检测到您位于堆栈的末尾,因此将尝试访问此无效地址,并为您提供分段错误。在main()函数中,将堆栈声明为"堆栈* s = NULL;",然后调用push等。
答案 1 :(得分:0)
将struct stack的下一个成员作为指针是有意义的。所以不应该这样 " temp-> next = * s;"。不应该是" temp-> next = s;"?
" * S"是一个解除引用的指针,它是一个值。
PS:我非常感谢编辑,我在网络移动设备上:)