【问题标题】:Pointer points to an address I didn't expect指针指向一个我没想到的地址
【发布时间】:2017-01-26 23:06:27
【问题描述】:

我不明白为什么t->next 指向与t 不同的地址。如果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

【问题讨论】:

  • 你没有初始化n-&gt;next

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    鉴于t = new Node 之后的以下每一行,请进行以下更改。

    为 n & t 分配的内存。

    n->+------------+ t->+------------+ |数据 = ? | |数据 = ? | |下一个 = ? | |下一个 = ? | +-----------+ +------------+

    分配给由 n 引用的内存的 data 元素的值。

    n-data = 2;
    
    n->+------------+ t->+------------+ |数据 = 2 | |数据 = ? | |下一个 = ? | |下一个 = ? | +-----------+ +------------+

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

    t->next = n;
    
    n->+------------+ t->+------------+ |数据 = 2 | |数据 = ? | +->|下一个 = ? | |下一个 = @n |--+ | +-----------+ +------------+ | +------------------------------------------------+

    t 的值被重定向到与t.next(当前为n)引用相同的内存。
    您应该注意到,您从未设置过 n 的 next 元素。

    t = t->next;
    
    vv 孤儿 vv n->+-----------+ +------------+ t->|数据 = 2 | |数据 = ? | +->|下一个 = ? | |下一个 = @n |--+ | +-----------+ +------------+ | +------------------------------------------------+

    警告您还丢失了在t = new Node; 中分配的内存位置的唯一引用。所以你有内存泄漏。

    【讨论】:

    • 也许要意识到的重要一点是 old t-&gt;next == n 但是通过更改 t,您实际上可以更改 t-&gt;data 和 @ 987654334@ 也是。
    • 我选择了您的答案,以直观地逐步解释问题所在。谢谢!
    【解决方案3】:

    这是应该的。 你做t = t-&gt;next - 之后,n == t。但是,您请求 t-&gt;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 - 显然是别的地方。

    顺便说一句,在你画完全图之后,列表很容易。一切都变得清晰

    【讨论】:

      【解决方案4】:

      这是链表的基础,一个类包含一个指向同一个类的另一个对象的指针,因此指针 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,它的 next 指针指向有数据 2 的 n

      n的next指针指向NULL;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-10
        • 1970-01-01
        • 2016-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-30
        相关资源
        最近更新 更多