簡體   English   中英

關於結構指針C ++的困惑

[英]confusion about struct pointer C++

我編寫了以下代碼。 我有一個問題:在這兩行中:

r1 = r;
r1 = new node(); 

我認為,當r1成為一個新的空節點時, r也應該是一個新的空節點,因為r1=r是一個指針分配,因此r1r代表相同的地址。 但是我一定是錯的,因為結果表明這里的r沒有改變。 有人可以向我解釋為什么r不變嗎? 謝謝。

#include<iostream>

using namespace std;

struct node{
    int id;
    node *child;
};


int main()
{
    node *r = new node();
    node *r1 = new node();
    r->id = 100;

    r1 = r;
    r1 = new node();
    r1->child = r;

    cout << "r1 " << r1->id << endl;
    cout << "r1 child " << (r1->child)->id << endl;
}

結果:

r1 0
r1 child 100

指針就是指針,它指向(指)其他東西。

我認為在這種情況下,以圖形方式了解事物可能是最容易的。 因此,執行以下操作后:

node *r = new node();
node *r1 = new node();
r->id = 100;

情況大致如下:

在此處輸入圖片說明

然后在執行時: r1 = r; ,您會遇到如下情況:

在此處輸入圖片說明

請注意,您已經泄漏了r1指向的node (即,您不再有指向它的指針,因此無法再將其刪除)。

然后當你做r1 = new node(); :您得到的是這樣的:

在此處輸入圖片說明

最后,執行r1->child = r; 你有這樣的事情:

在此處輸入圖片說明

它們不能相同。 rr1是內存中的兩個位置,可以保存到node地址(根據代碼中的定義),因此,當執行r1 = r ,這些內存位置中的值將變為相同(指針值)。

但是,當您以后執行r1 = new node; 然后new返回指向新創建對象的指針,該對象僅存儲在r1內存位置中。 由於存儲器中r位置的地址不變,因此可以看到結果。

我有一個問題:在這兩行中: r1 = r;r1 = new node(); 我認為當r1成為一個新的空節點時, r也應該是一個新的空節點,因為r1=r是一個指針分配

不。 當你做r1 = r; 所有你做的是價值設定r1 ,以相同的值r 它不會將r1r鏈接在一起,並且您在r1中所做的任何更改都不會對r

您還應注意, r1 = r; 導致內存泄漏,因為r1不再指向您最初創建的節點,並且您在分配之前沒有deletedelete

逐步執行代碼可能有助於解釋發生了什么。

    node *r = new node();

創建內存塊A並將r指向A

    node *r1 = new node();

創建內存塊B並將r1指向B

    r->id = 100;

取消引用r以找到A。 A中的 id設置為100

    r1 = r;

r1r指向同一點。 r1現在指向A。 AB之間沒有鏈接。 沒有任何內容從A復制到B。 r1僅重定向到點A而不是B。

B不再具有引薦來源,並且丟失了。 這稱為內存泄漏。 delete r1; 在重新分配之前,以防止這種情況。 更好的是,因為從不使用B ,所以不要一開始就分配它。

    r1 = new node();

創建內存塊C並將r1指向C。 如上所述, r1指向C而不是A。 沒有復制或其他副作用。 r1A之間不再有任何關聯。 A不變, r仍然指向A。

    r1->child = r;

解除引用r1以找到C。 C child指向A。

    cout << "r1 " << r1->id << endl;

解除引用r1以找到C。 C中打印出id C中的id從未分配值,因此使用它是未定義的行為。 可能會打印任何值,可能不會打印任何內容,或者該程序可能會使計算機變大腿並吃掉鄰居的貓,盡管這不太可能。

    cout << "r1 child " << (r1->child)->id << endl;

解除引用r1以找到C。 C中取消引用child 以找到A。 A ,100中打印出id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM