【发布时间】:2017-08-15 09:15:19
【问题描述】:
我的教授给了我们一个代码来编写,她给我们的部分代码是打印我们放入堆栈的内容。但是,正如我已经让她知道的那样,它不能正确打印堆栈中的内容。它抛出一个错误,这对我来说意味着在堆栈中打印信息后它会尝试继续,因为它实际上并没有清空堆栈。我的问题是,有人有解决方案吗?这是她给我们的代码片段:
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;
}
【问题讨论】:
-
发布执行“推送这些数字......”的代码存在问题(可能在第一次推送中)或使用错误。
-
编辑了上面的帖子以包含它
-
"temp->next = *s;"。不应该是“temp->next = s;”吗?
-
main()中初始化stack的时候,是否初始化为NULL?看起来它未初始化,并且设置为 0xCCCCCCCC,非常随机。因为它不是从 stack 初始化为 null 开始的,所以 is_empty() 调用不会检测到你在堆栈的末尾,因此会尝试访问这个无效地址,并给你一个分段错误。在您的 main() 函数中,将您的堆栈 s 声明为“stack *s = NULL;”,然后调用 push 等。
-
ScottK- 查看代码后,我意识到我确实没有将其初始化为 NULL。我已经设置好了。但是,我没有调用 main 开头的函数来开始初始化。这是一个小小的疏忽。您的帖子最有帮助,因为它最接近我的问题的正确原因。谢谢。
标签: c printing segmentation-fault stack syntax-error