C编程,堆栈,打印堆栈错误

时间:2017-03-23 01:16:19

标签: c printing segmentation-fault stack syntax-error

我的教授给了我们一个编写代码,她给我们的部分代码是打印我们放入堆栈的内容。但是,正如我已经让她知道的那样,它无法正确打印堆栈中的内容。它抛出一个错误,这意味着我在堆栈中打印信息后,它会尝试继续,因为它实际上并没有清空堆栈。我的问题是,任何人都有解决方案吗?这是她给我们的代码片段:

    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;
}

2 个答案:

答案 0 :(得分:0)

在main()中初始化堆栈时,是否将其初始化为NULL?

看起来它是未初始化的,并且设置为0xCCCCCCCC,非常随机。因为它不是从初始化为null的堆栈开始,所以is_empty()调用将不会检测到您位于堆栈的末尾,因此将尝试访问此无效地址,并为您提供分段错误。在main()函数中,将堆栈声明为"堆栈* s = NULL;",然后调用push等。

答案 1 :(得分:0)

将struct stack的下一个成员作为指针是有意义的。所以不应该这样 " temp-> next = * s;"。不应该是" temp-> next = s;"?

" * S"是一个解除引用的指针,它是一个值。

PS:我非常感谢编辑,我在网络移动设备上:)