我有一個關于 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。但是在我宣布一個帶有新功能的指標之后,它就正確了。為什么?
uj5u.com熱心網友回復:
指標是一個可以保存物件地址的盒子
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 指向某個有效的地方
uj5u.com熱心網友回復:
我只是嘗試宣布一個 ListNode 指標并將其下一個值分配給 nullptr
指標沒有任何資料成員。它是ListNode具有資料成員的型別的物件。
因此,您需要一個型別的物件,ListNode并使用指向該物件的指標,您可以為該物件的資料成員分配任何值next。
ListNode* tmp2 = new ListNode(1);
^^^^^^^^^^^^^^ ^^^^^^^^^^^
pointer object
至于這個代碼片段
ListNode* tmp;
tmp->next = nullptr;// This is wrong, why is that?
那么該型別的物件都不Listnode存在您可以更改的資料成員。此外,由于指標tmp未初始化并且具有不確定的值,因此使用這樣的指標訪問記憶體會導致未定義的行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/454259.html
