【问题标题】:Understanding Zero and NULL in C++了解 C++ 中的零和 NULL
【发布时间】:2015-12-12 20:16:13
【问题描述】:

在寻找关于我应该使用零还是空的答案时,我在another question 上从用户 stroustup 的 SO 中找到了这个:

我应该使用 NULL 还是 0?在C++中,NULL的定义是0,所以有 只是审美差异。我更喜欢避免使用宏,所以我使用 0。 NULL 的另一个问题是人们有时会错误地认为 它不同于 0 和/或不是整数。在预标准 代码,NULL 有时被定义为不合适的东西,并且 因此必须/必须避免。现在这种情况不太常见了。

所以 NULL 和 0 是一样的,这很酷。但我在这里需要更多的了解:假设我有以下内容(来自cprogramming.com 的随机示例):

struct node {
  int x;
  node *next;
};

int main()
{
  node *root;       // This won't change, or we would lose the list in memory
  node *conductor;  // This will point to each node as it traverses the list

  root = new node;  // Sets it to actually point to something
  root->next = 0;   //  Otherwise it would not work well
  root->x = 12;
  conductor = root; // The conductor points to the first node
  if ( conductor != 0 ) {
    while ( conductor->next != 0)
      conductor = conductor->next;
  }
  conductor->next = new node;  // Creates a node at the end of the list
  conductor = conductor->next; // Points to that node
  conductor->next = 0;         // Prevents it from going any further
  conductor->x = 42;
}

while ( conductor->next != 0) 行为例;据我了解,内存中的那个位置可能包含以前使用的垃圾值。当它被程序从使用中释放时,它再次变得可用。那么如何使用整数零作为比较的值,以检查您是否已到达链表的末尾?你能保证垃圾价值为零吗?为什么不...只是一个随机的垃圾值?

那么,我的理解完全不正确,还是在前一个程序释放该内存块的过程中,该内存是否重新归零?过去我一直使用 NULL,认为它是一个神奇的关键字,可以知道它是在查看零值还是垃圾值。但是,阅读上面对其他人问题的答案,我发现这是不正确的。对于这样一个微不足道的问题,我深表歉意,但每次我在我的应用程序中与 NULL 或零进行比较以检查是否存在某些东西时,这让我感到困扰,它只是有效,我不知道为什么。感谢您提供的任何启发。

【问题讨论】:

  • 在您的示例中,假设当对象被释放时,相应的指针立即被开发人员设置为 NULL 或 0。如果没有完成,那么您是正确的,直到程序终止,该特定位置将包含垃圾值,并且在大多数情况下,这些是堆损坏的来源。
  • 编译器会将0转换为NULL,就像C++中的truefalse可以与10互换一样
  • 在 C++ 中,NULL 的定义是 0……嗯,nullptr 就到这里了。
  • Bjarne Stroustrup 指出,在正确编写的 C++ 程序中不需要 NULL。 @ShreyanShet 那不正确。它被视为指示空指针的特殊值,但内部没有将其转换为 NULL 之类的东西。确实,NULL 只是零的一个宏,所以说相反的转换会更准确。

标签: c++ garbage-collection


【解决方案1】:

首先,Stroustrop 不仅仅是“用户”;他是 C++ 语言的原作者和发明者。这句话来自他的Frequently Asked Questions之一。

几乎所有 C 和 C++ 实现中的 NULL 只是 0 的 #define(文本替换)。所以区别纯粹是审美。

没有魔法。也许您不理解“下一个”指针。它是下一个项目的地址,而不是项目本身。由于没有有效的 0 指针,因此可以方便地表示列表中没有下一项。如果删除了一个节点,则不会自动将指向它的指针(即位于前一个节点中的下一个指针)设置回 NULL/0。

【讨论】:

    猜你喜欢
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2017-08-28
    相关资源
    最近更新 更多