ListNode的初始化

The initialization of ListNode

我有一个关于 ListNode 初始化的问题,如果我只是宣布一个 ListNode 指针,为什么我不能像代码中显示的那样分配它的下一个值。

struct ListNode {
     int val;
     ListNode *next;
     ListNode(int x) : val(x), next(nullptr) {}
};

ListNode* tmp;
tmp->next = nullptr;// This is wrong, why is that?

ListNode* tmp2 = new ListNode(1);
tmp2->next = nullptr;// This is right, what cause that?

我只是尝试宣布一个 ListNode 指针并将其下一个值分配给 nullptr。但是在我宣布一个具有新功能的指针之后,它就正确了。为什么?

I just try to announce a ListNode pointer and assign its next value to nullptr

指针没有任何数据成员。它是具有数据成员的 ListNode 类型的对象。

因此您需要一个 ListNode 类型的对象,并使用指向该对象的指针可以将任何值分配给该对象的数据成员 next

ListNode* tmp2 = new ListNode(1);
^^^^^^^^^^^^^^       ^^^^^^^^^^^
  pointer               object

至于这段代码

ListNode* tmp;
tmp->next = nullptr;// This is wrong, why is that?

那么 Listnode 类型的对象都不存在您可以更改的数据成员。此外,由于指针 tmp 未初始化且具有不确定的值,因此使用此类指针访问内存会导致未定义的行为。

指针是一个可以保存对象地址的盒子

 ListNode* tmp;
 tmp->next = nullptr;// This is wrong, why is that?

您在此处创建了框 (tmp),但未将对象的地址放入其中。 第二行说 - “在 tmp 中存储的地址的偏移量 4 处,请写 0”,好吧,框中没有有效地址,因此失败。

在第二个例子中

ListNode* tmp2 = new ListNode(1);
tmp2->next = nullptr;// This is right, what cause that?

你说

"Please make a new ListNode object"
"Put its address in the box called tmp2"
"at offset 4 from the address stored in tmp2 please write 0"

这可以工作,因为盒子 tmp2 指向某个有效的地方