【问题标题】:crash after printing linked list [closed]打印链表后崩溃[关闭]
【发布时间】:2013-06-20 03:37:43
【问题描述】:

我有以下结构:

struct coords
{
    int x;
    int y;
    struct coords* previous;
    struct coords* next;
};

然后我有一个这些坐标的双向链表(格式为 (x,y)),它应该看起来像这样(其中头和尾是列表的开始和结束):

head                                                          tail
(-1, -1) <--> (0, 1) <--> (2, 1) <--> (1, 0) <--> (0, 2) <--> (-1, -1)

我想打印这个列表,所以我有以下代码:

struct coords* iter = head;
while (iter->next != NULL)
      {
          printf("\n [this node: (%d, %d)] -> [next node: (%d), (%d)]", iter->x, iter->y, iter->next->x, iter->next->y);
          iter = iter->next;
      }
printf("done with loop");

我得到的输出是这样的:

[this node: (-1, -1)] -> [next node: (0, 1)]
[this node: (0, 1)] -> [next node: (2, 1)]
[this node: (2, 1)] -> [next node: (1, 0)]
[this node: (1, 0)] -> [next node: (0, 2)]
[this node: (0, 2)] -> [next node: (-1, -1)]

这都是正确的。但是,在打印最后一行后,我的程序立即崩溃,没有打印“循环完成”。

【问题讨论】:

  • 您确定最后一项的next 设置为空吗?
  • 一个非常简单的解决方案。我不知何故忽略了这一点。谢谢。

标签: c crash linked-list printf doubly-linked-list


【解决方案1】:

你确定tail->next的值是NULL吗?

如果不是,那就是原因!

【讨论】:

    【解决方案2】:

    您如何将节点插入到列表中? -1, -1 节点上的下一个指针很可能不为空。因为它不是 null,所以 null 检查通过,但是当您尝试调用 iter->next->x 时,->x 取消引用虚假内存并且您的程序崩溃。检查的简单方法是打印下一个指针。

    printf("\n [this node: (%d, %d)] -> [next node: (%d), (%d)], next next= %p", iter->x, iter->y, iter->next->x, iter->next->y, iter->next->next);
    

    它应该是非空的,除了打印的最后一行,在这种情况下它应该是空的。

    大多数插入代码都会传播初始 head 值,所以我猜你可能在声明时没有将 head 指针初始化为 null。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 2012-10-10
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      相关资源
      最近更新 更多