0

我的问题是q->next总是打印相同的地址,但我分配了q = &x;. 为什么它不打印不同的地址?

#include <stdio.h>


class Node
{
public:
    int val;
    Node *next;
    Node(int v,Node *p) { val=v, next=p; }
};


int main()
{
    Node head(0, NULL);
    Node *q = &head;

    int i = 5;
    while (i>0)
    {
        Node x(i * 10, q);
        q = &x;
        printf("# %d %p\n", q->val, q->next);
        i--;
    }
}
4

8 回答 8

2

在循环的第一次迭代中,q包含 的地址head。在每次后续迭代中,q包含 的地址x

这意味着在第一次迭代中,q->next产生 的地址,head并且在每次后续迭代中,q->next产生 的地址x。但是,x是在循环内部、堆栈上创建的。由于中间的堆栈没有变化,因此x对象总是出现在堆栈上的相同位置。

所以我希望程序首先打印head四个对象的地址,然后打印四倍的地址x(它们都恰好被分配在堆栈的同一位置)。

于 2011-08-19T06:46:06.513 回答
2

我认为原因是,在 while 循环中,您在堆栈上声明了 x 。然后在while循环结束后,变量被“销毁”。然而,在随后的迭代中,x 再次使用完全相同的(堆栈)内存位置保留在堆栈上。

请注意,您不会获得带有有效指针的链表。您需要使用“new”运算符在堆上创建节点实例。

编辑:

如果您不想在堆上分配内存,则可以使用此处描述的“使用节点数组的链接列表”方法。但是,缺点是您需要提前知道最大节点数。

于 2011-08-19T06:47:05.327 回答
1

您正在堆栈上创建节点 - 尝试使用新的。

于 2011-08-19T06:43:27.320 回答
1

这与 x 的分配方式有关:它是主函数内的局部变量。这意味着它被分配在堆栈上的特定位置。您一直在重复使用同一块内存。相反,请尝试为新节点分配内存 ( new)。

于 2011-08-19T06:43:58.373 回答
1

xwhile循环中的局部变量。它的生命周期只是循环的一次迭代。

您应该像这样动态分配Node对象:

Node* x = new Node(value, next);

所以他们的生命周期一直持续到你取消分配对象:

delete x;
于 2011-08-19T06:44:20.930 回答
1

节点 x 正在堆栈上创建,每次循环时,它都会被创建,然后在块的末尾再次被销毁。并且每次循环都会在同一位置创建。

你可能想要:

Node *x = new Node( i*10, q );
q = x;
于 2011-08-19T06:45:22.197 回答
1

您继续设置nextq

Node x(i * 10, q);
于 2011-08-19T06:45:34.940 回答
1

您的 x 节点分配在本地堆栈上,而不是堆上,因此当您的变量在每次循环迭代时被回收时,它会收到相同的本地地址。要创建 i = 5 个唯一节点,您需要使用 new() 运算符在堆上分配对象。您还需要添加代码来销毁您分配的对象。

example:


Node * px = new  Node(i*10, 1);
于 2011-08-19T06:45:58.510 回答