【问题标题】:Application of null pointer [closed]空指针的应用[关闭]
【发布时间】:2015-01-05 23:53:10
【问题描述】:

我在一家公司面试,他们问我“空指针在 C 中的应用是什么”?我告诉他们空指针是什么以及它如何导致分段错误。然而,他们对这个答案并不满意。我以前从未听说过这样的事情。如果有人有任何想法,请分享。

谢谢

【问题讨论】:

  • 如何导致段错误?我认为只有在您尝试尊重它时才会发生这种情况,因为它并没有真正指向内存中的任何内容,因此是段错误。但是这个问题是+1。我能想到的唯一应用是将它作为一个标记来指示指针尚未分配内存或在这种情况下作为失败的信号。
  • 在 C++ 中,我们使用它们来标记链式数据结构的结束或开始 - 嗯。我讨厌面试(呃)问题

标签: c pointers null-pointer


【解决方案1】:

他们问的是什么时候需要使用 NULL 指针,而不是什么时候会导致问题。

经典的答案是,它们在没有可指点的情况下使用。例如,列表中的下一个指针,当它位于列表的末尾时 -> 没有下一项。

所以在你的代码中你去

if(nextItem != NULL)
{
  // do stuff with nextItem
}
else
{
// the end
}

正如 mooseboy 指出的那样,这是一个哨兵值,即您的代码识别为具有决定性价值的特殊值。

NULL 是完美的指针标记,因为 NULL 被假定永远不是指针的有效值(例如,您不能使用 0x000042,因为 42 可能是真实地址)

【讨论】:

  • 以这种方式使用时,您将 NULL (0) 用作sentinel value。它真的不是地址0x00000000的意思,它有特殊的含义。
  • @MooseBoys:谁说地址0?在 C 中,NULL根据定义是一个标记值(它是一个指针值,不是陷阱表示,保证不会被任何有效对象获取,并且在取消引用时会导致未定义的行为),它原则上与地址空间的地址0处的内容无关。
  • @Matteo - 那不是我 - 但仅供参考。我是在一台 NULL 为 0xFFFFFFFF 的机器上长大的
  • @pm100:实际上,这不符合 C 标准;标准要求 NULL 在您的 C 代码中“显示”为 0(IIRC 已经有一些编译器竭尽全力确保即使在 0 是有效地址的平台上这种错觉也成立 - 你 writecompare 为零,但底层位模式可以是任何东西)。
  • @MatteoItalia:他并不是说 C 空指针未正确转换为机器空指针。他是说机器空指针并非全为零。
【解决方案2】:

这个问题有点含糊,但他们可能不满意的一件事是,从纯语言的角度来看,取消引用 NULL 并不一定会导致段错误。它会导致未指定的行为,即语言没有说明会发生什么。在大多数平台上,是的,空引用会导致段错误,但 C 的实现可以做其他事情并且仍然符合标准。

【讨论】:

  • 确定大多数平台都是 PC,或者至少有 MMU?还有更多的嵌入式系统...
  • 这个问题在 C 中被标记,在 Linux 中,尝试遵循空指针会导致一致的行为 == segfault :) 不过你是正确的。 Windows 和其他操作系统的行为可能不同
  • @rurouni88:不是真的,即使你对使用 Linux 做出了绝对没有根据的假设。一个可以映射 0 地址,具有足够的权限,而且无论如何在内核方面的事情更有趣。
  • @Deduplicator in C 如何映射 0 地址并将指针与 NULL 区分开来?
  • 不,空指针肯定会被评估为假。
猜你喜欢
  • 2014-01-07
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多