我的问题是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--;
}
}
答案 0 :(得分:2)
在循环的第一次迭代中,q
包含head
的地址。在每次后续迭代中,q
都包含x
的地址。
这意味着在第一次迭代时,q->next
产生head
的地址,并且在每次后续迭代中,q->next
产生x
的地址。但是,x
是在堆栈内的循环内创建的。由于堆叠中间没有变化,x
对象始终出现在堆栈的同一位置。
所以我希望程序首先打印head
的地址,然后打印四个x
对象的地址的四倍(这些对象都恰好分配在堆栈的同一位置)。
答案 1 :(得分:2)
我认为原因是,在while循环中,您在堆栈上声明x。然后在到达while循环结束后,变量被“销毁”。然而,在随后的迭代中,x使用完全相同(堆栈)的内存位置再次在堆栈上保留。
请注意,您不会获得带有效指针的链接列表。您需要使用“new”运算符在堆上创建Node实例。
修改强>
如果您不想在堆上分配内存,可以使用描述here的“使用节点数组的链接列表”方法。但缺点是,您需要事先知道最大节点数。
答案 2 :(得分:1)
您正在堆栈中创建节点 - 尝试使用新的。
答案 3 :(得分:1)
这与x的分配方式有关:它是main函数中的局部变量。这意味着它被分配在堆栈上的特定位置。你一直在重复使用同一块内存。相反,尝试为新节点分配内存(new
)。
答案 4 :(得分:1)
x
是while
循环中的局部变量。它的生命周期只是循环的一次迭代。
您应该动态分配Node
个对象,如下所示:
Node* x = new Node(value, next);
所以他们的生命周期一直持续到你取消分配对象为止:
delete x;
答案 5 :(得分:1)
正在堆栈上创建节点x,每次绕过循环时,它将被创建,然后在块结束时再次销毁。每次围绕循环,它都将在同一位置创建。
你可能想要:
Node *x = new Node( i*10, q );
q = x;
答案 6 :(得分:1)
您一直将next
设置为q
:
Node x(i * 10, q);
答案 7 :(得分:1)
您的x节点在本地堆栈上分配,而不是在堆上,因此您的变量在每次循环迭代时都会被回收,它会收到相同的本地地址。要创建i = 5 uique节点,您需要使用new()运算符在堆上分配对象。您还需要添加代码以便在之后使用已分配的对象。
example:
Node * px = new Node(i*10, 1);