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的开头调用函数来开始初始化。这是一个小小的疏忽。你的帖子是最有帮助的,因为它最接近我问题的正确原因。非常感谢。