【问题标题】:C programming, stacks, printing stack errorC编程,堆栈,打印堆栈错误
【发布时间】: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


【解决方案1】:

在main()中初始化stack时,是否初始化为NULL?

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

【讨论】:

    【解决方案2】:

    结构栈的下一个成员是指针是有意义的。所以不应该
    “临时->下一个 = *s;”。不应该是“temp->next = s;”吗?

    “*s”是一个解引用的指针,是一个值。

    PS:我很感激编辑,我在移动网络上:)

    【讨论】:

      猜你喜欢
      • 2020-08-28
      • 2014-04-22
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      相关资源
      最近更新 更多