【问题标题】:Why does NULL Pointer check not work while iterating through singly-linked list in C?为什么在 C 中遍历单链表时 NULL 指针检查不起作用?
【发布时间】:2013-10-16 23:34:58
【问题描述】:

我正在尝试从堆中打印。如果我遇到一个 NULL 指针,我应该打印 NULL;否则,打印它的值。

样本输出:

1   [2]
2   null
3   null
4   [7, 3]
5   null
6   [7]

但是我的代码因为取消引用 NULL 指针而不断崩溃。

这是我写的测试代码:

void printResult(IntList* intL, int nNode, int nEdge)
{
    int i;
    for (i; i <= 10; i++)
    {
        if (intRest((intL))
        {
            printf("%d", intFirst((intL)[i]));
            intRest((intL)[i]);
        }
        else
            printf(" NULL ");
    }
}

//Here is the definition of functions:
//First
int intFirst(IntList oldL)
{
    return oldL->element;
}

/** rest
 */
IntList intRest(IntList oldL)
{
    return oldL->next;
}
//=================
struct IntListNode
{
    int element;
    IntList next;
};

//===================
typedef struct IntListNode * IntList;

【问题讨论】:

  • 旁注:typedef struct IntListNode * IntList; 不是个好主意。这很令人困惑。
  • for (i; i &lt;= 10; i++) 这是什么? 2)if (intRest((intL))intRest()是什么,为什么需要双括号?
  • 代码可以编译,但是一旦达到 NULL 就会崩溃。
  • 我怀疑它是否可以编译。

标签: c loops pointers null singly-linked-list


【解决方案1】:

你有一个由节点组成的单链表,这些节点没有存储在连续的内存块中(它们相当分散),因此试图以这种方式遍历它的元素:

for (i; i <= 10; i++)
    printf("%d", intFirst((intL)[i]));

导致未定义的行为,因为您访问了错误的内存。你应该这样做:

struct IntListNode * ptr = *intL;
while (ptr) {
    printf("%d", ptr->element);
    ptr = ptr->next;
}

【讨论】:

  • 当我试图编译 ptr = ptr->next;它给了我这个错误消息:不允许指向不完整类类型的指针。有什么建议吗?
  • @user2888425: 可能是因为你传递了IntList* intL 类型的参数,这是由于你混淆了typedef 实际上struct IntListNode **。尽量避免创建隐藏它实际上是指针的信息的别名。
  • @user2888425:另请注意,在您的结构中定义next 时,将其类型明确定义为struct IntListNode* 似乎更合适。
  • 对不起,我有点困惑。我尝试了 IntList 和 IntListNode 的不同变体,但无法使其工作。我认为问题在于我无法遍历列表。有没有办法通过初始化更高级别的指针或类似的东西来遍历列表?
  • @user2888425:遍历节点应该看起来像我在回答中写的那样。查看本教程,也许它会让你更清楚:cprogramming.com/tutorial/c/lesson15.html
【解决方案2】:

如果

IntList intRest(IntList oldL)
{
    return oldL->next;
}

是您在if (intRest((intL)) 中对NULL 的测试,

如果 intL == NULL,您的代码将崩溃。

【讨论】:

  • @LihO 这是问题之一。你强调的问题也很重要。但两者都需要修复。
猜你喜欢
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多