【问题标题】:C - Why must NULL be compared to?C - 为什么必须与 NULL 进行比较?
【发布时间】:2016-04-06 09:16:16
【问题描述】:

我很好奇为什么说我迭代遍历链表时我必须使用while (list != NULL) 而不是while (!list)。我认为 NULL 等于零或假。

来自 cmets:当我尝试 while (!list) 时,我的程序似乎总是崩溃,但从不是前者。每个节点都包含一个指向一条数据的 void 指针和一个指向下一个节点的指针。

【问题讨论】:

  • 你会从他们两个得到相同的结果
  • 风格问题。第一个对读者来说更清楚。
  • @nos 当我尝试!NULL 时,我的程序似乎总是崩溃。它是一个有效的列表,其中每个节点都包含一个指向一段数据的 void 指针和一个指向下一个节点的指针。
  • @nos 我所做的只是遍历链表。每次都在做list = list -> next。那我太没主意了……尤其是因为它可以与一个一起工作,但不能与另一个一起工作。
  • NULL is not zero!NULL 为 1,因此您几乎总是会收到段错误,因为 1 在大多数系统上不是有效地址

标签: c linked-list


【解决方案1】:

while (list != NULL)while (!list) 不同。他们是对立的!当然,您的程序会崩溃,它会尝试取消引用 NULL 指针。

while (list != NULL)while (list) 相同。

【讨论】:

  • 当您在地牢中度过数日试图让相同的功能正常工作时,您会开始忘记基本的事情。我希望这可以帮助未来的同志从事与我相同的课程。谢谢。
  • 印象深刻的是 OP、2 个评论者和 3 个对这些 cmets 的赞成票都忽略了 2 个代码片段具有相反的功能。 (如果我没有先阅读这个答案,也许我自己会错过它。)建议这是由于将两个陈述与其中的! 进行比较而造成的混淆。恕我直言,最好使用while (list)。或者当代码需要做相反的事情时使用while (list == NULL)。两者都不使用!
【解决方案2】:

在大多数情况下,这是风格问题。与NULL 的比较更加明确。

如上所述,if(ptr != NULL) 等价于if(ptr)

【讨论】:

  • 这是不正确的。您将 NULL 宏与空指针混合在一起。 NULL 是总是 0(void*)0Read this.
  • @Lundin 我做了一些谷歌搜索。是的,那是我知识上的空白。我会删除这部分。
  • @Lundin 确定性NULL 宏可以是0(void*)0。然而,C 规范并未将其定义为仅这两个。其他是可能的,包括((void*)0)(-0)((intptr_t) 0)
  • @chux 我的错,不知为何我以为你写了(intptr_t*)。你是对的,我会删除评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 2012-04-22
  • 2013-05-04
  • 1970-01-01
相关资源
最近更新 更多