理解C ++中的零和NULL

时间:2015-12-12 20:16:14

标签: c++ garbage-collection

在搜索关于我是否应该使用Zero或Null的答案时,我在another question来自用户stroustup的这个问题上找到了这个:

  

我应该使用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或零进行比较以检查是否存在某些事情让我感到困扰它只是有效并且我不知道为什么。谢谢你能放下任何光线。

1 个答案:

答案 0 :(得分:1)

首先,Stroustrop不只是"用户&#34 ;;他是C ++语言的原作者和发明者。这句话来自他的一个Frequently Asked Questions

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

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