指针地址在链接列表中不会更改

时间:2011-08-19 06:39:24

标签: c++ pointers pointer-address

我的问题是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--;
    }
}

8 个答案:

答案 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)

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

您应该动态分配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);