为什么我在c++中不能打印NULL地址?

问题描述 投票:0回答:1

比方说,我有一个Linked list类,如下图。

struct Node {
    int data;
    Node* rptr;
};

class LinkedList
{
public:
    Node* curr;
    Node* prev;
    Node* first;
    Node node;

    LinkedList()
    {
        curr = NULL;
        prev = NULL;
        first = NULL;
        node.data = NAN;
        node.rptr = NULL;
    }

    void push(int);
    void pop();
};

void LinkedList::push(int data) 
{
    curr = new Node;
    curr->data = data;
    curr->rptr = NULL;

    if (first == NULL)
    {
        prev = first = curr;
    }
    else
    {
        prev->rptr = curr;
        curr->data = data;
        prev = curr;
    }


}

void LinkedList::pop()
{
    Node* temp = NULL;
    if (first == NULL)
    {
        cout << "No more Data Element\n";
    }
    else
    {
        cout << first->data<<'\n';
        temp = first;
        first = first->rptr;
        cout << first->rptr << endl;//error on this line
        delete temp;
    }
}

而我的main如下

int main()
{
    LinkedList l1;

    l1.push(10);
    l1.push(20);
    l1.push(30);
    l1.pop();
    l1.pop();
    l1.pop();
    l1.pop();
    l1.pop();
}

我的问题是,当我试图打印NULL的地址时,它给我一个异常。我有什么办法可以打印它,因为它打印其他地址很好,但打印这个NULL的地址就不行。

在Python中,我们可以很容易地看到,如果我们将None赋值给某个东西并打印它。那么C++是否有同样的功能呢?

c++ pointers linked-list
1个回答
7
投票

这里的问题是,你没有尝试打印一个 nullptr但你访问它并想打印结果。在你得到打印结果之前,你的程序已经出现了一个与打印完全无关的空指针异常。

first = first->rptr;

first 是一个有效的指针(而不是nullptr),并且你将它赋值给了 first 现在的内容是什么 rptr. 在你的情况下,值为 first->rptrnullptr.

如果你想 first->rptr 再一次,你想从第一个指向的地方得到值,这是不可能的。

你之前已经检查过了 first 是有效的 ( 不是 nullptr ),但在得到新的值后,你却没有。

BTW: 你应该使用 nullptr 而不是 NULL 如果你想给指针分配一个 "0",或者与此进行比较。

© www.soinside.com 2019 - 2024. All rights reserved.