指针指向一个我没想到的地址

时间:2017-01-26 23:06:27

标签: c++ list pointers struct memory-address

我不明白为什么t->next指向的地址与t不同。如果t->next指针等于n的地址且t指针等于t->next的地址,为什么t->next似乎指向不同的地址ADRESS?我被困在这里。

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

4 个答案:

答案 0 :(得分:3)

首先,你确实有t->next == n所以他们应该指向同一个地址。但是,您进一步执行t = t->next,因此t现在指向另一个节点(指向n的同一节点,具体而言)并且其next未初始化,因此,“随机”值位于输出的末尾。如果只打印t,您应该看到与第一个相同的值。

答案 1 :(得分:1)

data以下各行之后,如下所示进行以下更改。

为n&amp;分配的内存吨。

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

分配给n。

引用的内存的n-data = 2; 元素的值
next
n->+-----------+  t->+-----------+
   |data = 2   |     |data = ?   |
   |next = ?   |     |next = ?   |
   +-----------+     +-----------+

分配给t引用的t->next = n; 内存元素的值。
而这恰好是n的位置。

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

重定向到引用与n相同的内存(当前为next)的值。
你应该注意到,你没有设置n的t = t->next; 元素。

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

警告 您还失去了{{1}}中分配的内存位置的唯一引用。所以你有内存泄漏。

答案 2 :(得分: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-&gt; next - 显然在其他地方。

顺便说一句,绘制完整张图后,列表很容易。一切都变得清晰

答案 3 :(得分: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有数据5,它的下一个指针指向n,它有数据2

n的下一个指针指向NULL;