C编程,堆栈,打印堆栈错误
我的教授给了我们一个代码来编写,她给我们的部分代码是打印我们放入堆栈中的内容。但是,正如我已经让她知道的那样,它无法正确打印堆栈中的内容。它抛出了一个错误,对我来说,这意味着在打印堆栈中的信息后,它试图继续,因为它实际上并没有清空堆栈。我的问题是,有人能解决这个问题吗?下面是她给我们的代码片段:C编程,堆栈,打印堆栈错误,c,printing,segmentation-fault,stack,syntax-error,C,Printing,Segmentation Fault,Stack,Syntax Error,我的教授给了我们一个代码来编写,她给我们的部分代码是打印我们放入堆栈中的内容。但是,正如我已经让她知道的那样,它无法正确打印堆栈中的内容。它抛出了一个错误,对我来说,这意味着在打印堆栈中的信息后,它试图继续,因为它实际上并没有清空堆栈。我的问题是,有人能解决这个问题吗?下面是她给我们的代码片段: void print_stack(stack s) { if (!is_empty(s)) { printf(“%d\n”, s->
void print_stack(stack s)
{
if (!is_empty(s))
{
printf(“%d\n”, s->data);
print_stack(s->next);
}
}
它正确地打印堆栈中的数字,但随后在PuTTY中抛出分段错误,并在Visual Studio中抛出异常。将这些数字(1、2、3)推到堆栈上后,它将打印:
三,
2.
1.
-1991643855
分段导通故障(堆芯倾倒)
在Visual Studio中,它只是简单地说:
引发未处理的异常:读取访问冲突
s是0xcccc
先谢谢你
推送代码为:
void push(stack*s, int num)
{
stack temp;
temp = (stack)malloc(sizeof(struct stacknode));
temp->data = num;
temp->next = *s;
*s = temp;
}
在main()中初始化堆栈s时,是否将其初始化为NULL
它看起来是未初始化的,并且设置为0xCCCC是随机的。因为它不会在堆栈s初始化为null时启动,因此is_empty()调用不会检测到您位于堆栈的末尾,因此将尝试访问此无效地址,并给您一个分段错误。在main()函数中,将堆栈声明为“stack*s=NULL;”,然后调用push等。结构堆栈的下一个成员作为指针是有意义的。所以不应该
“临时->下一步=*s;”。它不应该是“temp->next=s;”吗 “*s”是一个取消引用的指针,它是一个值
PS:我很感谢您的编辑,我在移动网络上:)发布“推送这些数字…”的代码。问题是(可能在第一次推送时)存在,或者使用错误。请编辑上面的帖子以包含它“temp->next=*s;”。它不应该是“temp->next=s;”?在main()中初始化堆栈s时,是否将其初始化为NULL?它看起来是未初始化的,并且设置为0xCCCC是随机的。因为它不会在堆栈s初始化为null时启动,因此is_empty()调用不会检测到您位于堆栈的末尾,因此将尝试访问此无效地址,并给您一个分段错误。在main()函数中,将堆栈s声明为“stack*s=NULL;”,然后调用push等ScottK-查看代码后,我意识到我确实没有将其初始化为NULL。我已经准备好了。但是,我没有在main的开头调用函数来开始初始化。这是一个小小的疏忽。你的帖子是最有帮助的,因为它最接近我问题的正确原因。非常感谢。