2017-01-26 10 views
0

なぜt->nextt以外のアドレスを指しているのか分かりません。 t->nextポインタがnのアドレスに等しく、tポインタがt->nextのアドレスと等しい場合、t->nextは異なるアドレスを指しているように見えますか?私はここで立ち往生している。ポインタは私が期待していないアドレスを指しています

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

int main() { 
    Node* n; 
    Node* t; 
    Node* h; 

    n = new Node; 
    t = new Node; 

    n->data = 2; 
    t->next = n; 
    t = t->next; 

    cout << n << "\n" << n->data << "\n" << t << "\n" << t->next << endl; 

} 

出力:

 
0x7a11c8 
2 
0x7a11c8 
0x65685372 
+1

あなたは 'n> next'を初期化しませんでした。 –

答えて

1

t = new Nodeの後に次の行がそれぞれ以下のように変更されます。

メモリはnのために割り当てられました& t。

 
n->+-----------+ t->+-----------+ 
    |data = ? |  |data = ? | 
    |next = ? |  |next = ? | 
    +-----------+  +-----------+ 

nで参照されるメモリのdata要素に割り当てられる値。

n-data = 2; 
 
n->+-----------+ t->+-----------+ 
    |data = 2 |  |data = ? | 
    |next = ? |  |next = ? | 
    +-----------+  +-----------+ 

Tによって参照されるメモリのnext要素に割り当てられる値。
これはnの場所になります。

t->next = n; 
 
n->+-----------+ t->+-----------+ 
    |data = 2 |  |data = ? | 
+->|next = ? |  |next = @n |--+ 
| +-----------+  +-----------+ | 
+-----------------------------------+ 

Tの値は、(現在nある)t.nextと同じメモリを参照するリダイレクト。
いつもnのnext要素を設定していないことに注意してください。

t = t->next; 
 
        vv orphan vv 
n->+-----------+  +-----------+ 
t->|data = 2 |  |data = ? | 
+->|next = ? |  |next = @n |--+ 
| +-----------+  +-----------+ | 
+-----------------------------------+ 

WARNINGまた、あなただけの参照t = new Node;に割り当てられたメモリの場所を失ってしまいました。だからあなたはメモリリークを持っています。

+0

おそらく重要なことは、***古い*** 't-> next == n'ですが、' t'を変更することで、 't-> data'と' t-next'も効果的に変更することができます。 –

+0

視覚的に何が間違っているのかを説明する答えを選択しました。ありがとう! – svb

3

まず、あなたは確かにt->next == nので、彼らは同じアドレスを指している必要があります持っています。しかし、さらにt = t->nextを実行するので、tは別のノード(同じノードがnと指定されています)とそのnextが未初期化であるため、出力の最後に「ランダム」値があります。 tを印刷すると、最初のものと同じ値が表示されます。

0

このようにする必要があります。 t = t->next - その後、n == tです。しかし、その後、あなたは

サンプルコード設定されませんでしたt->next要求:

t->next = n; // t->next == n 
t = t->next; // t == t->next == n 
// calling t->next 
std::cout << t; // t == n 
std::cout << t->next; // the same as n->next or t->next->next for previous state of t 

をだからあなたが見るものである:N Tはありません同じ場所にポイントとして。 t-> next - 他のどこか、明らかに。

ちなみに、画像全体を描いた後では、リストは簡単です。すべてが明確になります

0

これはリンクリストの基本です。クラスには同じクラスの別のオブジェクトへのポインタが含まれているため、ポインタnにはデータと次のオブジェクトのアドレスがあり、次のオブジェクトも同じ動作をしますように...

Node* n; 
Node* t; 

n = new Node; 
n->data = 2; 
n->next = NULL; 

t = new Node; 
t->data = 5; 
t->next = n; // link the nodes 


//t = t->next; // why this it like moving in linked list through nodes 

現在、tはデータ2

NULLにn個の点の次のポインタを有するnにデータ5と、その次のポインタ点を有します。

関連する問題