2016-03-16 126 views
0

說,如果我有像這樣定義一個二叉樹節點:(和只是假設所有成員都是公共爲了方便...)曖昧調用類成員的參考

class node 
    { 
    public: 
     int v; 
     node* left; 
     node* right; 
    //member functions.... 
    } 

我有兩個節點的指針命名爲A B和運行以下腳本:

node* A; 
    node* B; 
    A->left = B; 
    A->left = NULL; 

是否讓b指向了NULL或它只會改變A的左子指針(即這個 - >留在* A)和B仍然是它用來指向?

如果前一種情況屬實,如何在不影響B的情況下更改A->左邊的值?

TIA!

回答

3

不,它沒有。 A->left = NULL只改變了值A->left

注:我假設AB已經以某種方式初始化,因爲如果你運行

node* A; //uninitialized 
node* B; //uninitialized 
A->left = B; 
A->left = NULL; 

,你會得到一個崩潰。

更新/澄清:最有可能的,我的意思是。但即使它可以工作(例如,由於你的驚人(缺乏)運氣,你可能會得到一個指向有效內存區域的垃圾值),但它不會有任何好處。如果你會得到一個有效的內存區域,並寫有會帶來一些理想的結果,應立即停止調試,並去附近的賭場,你有一個幸運的一天:)

+0

UB是沒有必要的崩潰:/ 。 – Jarod42

+0

@ Jarod42,在這個確切的情況下,有99.84%的概率(值被測量和準確:)),所以我決定不深入研究它。 「這是UB」聽起來像「它可能會起作用,但很可能因某種原因而在某處斷裂」。在這種情況下(我們將垃圾值作爲指針取消引用並嘗試在其中寫入),它會在任何地方崩潰(幾乎)。除非OP非常幸運,否則他的編譯器非常詼諧。不過,如果你願意,我現在編輯答案,使其更具體。 – FreeNickname

+0

謝謝。是的,我忘了初始化型A和B(抱歉,因爲我更專注於問題本身,而不是代碼的代碼,只要確保訪問A->左基本上訪問的地址(A +的sizeof (int)),對嗎?(即這個 - >而不是B)) –