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

その理由は、whileループ内で、スタック上でxを宣言しているためだと思います。次に、whileループの終わりに達した後、変数は「破棄」されます。ただし、後続の反復では、xは、まったく同じ(スタック)メモリの場所を使用して、スタック上で再び予約されます。

有効なポインタを持つリンクリストは取得されないことに注意してください。'new'演算子を使用して、ヒープ上にノードインスタンスを作成する必要があります。

編集:

ヒープにメモリを割り当てたくない場合は、ここで説明する「ノードの配列を使用したリンクリスト」アプローチを使用できます。ただし、欠点は、ノードの最大数を事前に知っておく必要があることです。

于 2011-08-19T06:47:05.327 に答える
2

ループの最初の反復ではq、のアドレスが含まれますhead。後続の各反復で、qのアドレスが含まれますx

This means that on the first iteration, q->next yields the address of head and on each subsequent iteration, q->next yields the address of x. However, x is created inside the loop, on the stack. Since there is no change to the stack inbetween, the x object always appears at the same place on the stack.

So I'd expect the program to print first the address of head and then four times the address of the four x objects (which all happen to be allocated at the same position of the stack).

于 2011-08-19T06:46:06.513 に答える
1

スタック上にノードを作成しています-newを使用してみてください。

于 2011-08-19T06:43:27.320 に答える
1

これは、xの割り当て方法と関係があります。これは、main関数内のローカル変数です。つまり、スタックの特定の位置に割り当てられます。あなたはいつも同じメモリを再利用しています。代わりに、新しいノードにメモリを割り当ててみてください(new)。

于 2011-08-19T06:43:58.373 に答える
1

xwhileループ内のローカル変数です。その存続期間は、ループの1回の反復のみです。

Node次のようにオブジェクトを動的に割り当てる必要があります。

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

したがって、オブジェクトの割り当てを解除するまで、その存続期間は続きます。

delete x;
于 2011-08-19T06:44:20.930 に答える
1

ノードxはスタック上に作成されており、ループを一周するたびにノードxが作成され、ブロックの最後で再び破棄されます。そして、ループを一周するたびに、同じ場所に作成されます。

あなたはおそらく欲しい:

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

次のように設定nextし続けますq

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

xノードはヒープではなくローカルスタックに割り当てられるため、変数はループの反復ごとにリサイクルされるため、同じローカルアドレスを受け取ります。i = 5のuiqueノードを作成するには、new()演算子を使用してヒープにオブジェクトを割り当てる必要があります。後で割り当てられたオブジェクトを破棄するコードを追加することもできます。

example:


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