2

関数が特定のノードのアドレスを返すようにしたいのですが、作成したノード データ型構造をコンパイラが検出しません。

struct node
{
int data;

node *link;
};

node *header,*current;
node traverse(int pos);


node *Linkedlist::traverse(int pos)
{
    int location = 0;  
    current->link = header->link;
    node *address = new node;
    address->data = NULL;
    address->link = NULL;


    while(current->link != NULL)
    {

        if(location == pos)
        {
            cout <<current->link->data <<" "<< endl; 
            address->link=current->link;
        }
        location ++;
        current->link = current->link->link;

    }


    return  address->link;
}
4

2 に答える 2

5

変化する

return  *address;

return  address;
于 2013-01-13T04:09:16.783 に答える
1

アドレスはノードへのポインタ変数であるため、変数を返すだけで済みます。

先行する*ポインター変数は明示的な参照です。これは、ポインター変数が指す値を取得することを意味しますaddress&これは、変数のアドレスをフェッチするオペレーターが行うこととは相容れないものです。

return  address;

したがって、変数が指す値を返すのではなく、変数を返す必要があるのは論理的です。

traverseの呼び出し元は、呼び出しによって明示的にメモリを解放するように注意する必要がありますdelete。そうしないと、メモリリークが発生します。これは、ローカルスコープ内にヒープオブジェクトを割り当ててアドレスを返すという潜在的な設計上の問題が原因です。

node * foo = Linkedlist::traverse(n);
...............
delete foo;

ヒープ内にオブジェクトを作成するか、クラスメンバーとして追加するだけで済みます。前者の場合、オブジェクトの所有権をあるスコープから別のスコープに簡単に譲渡できます。後者の場合、オブジェクトの存続期間です。オブジェクトによって制御されていたでしょうLinkedlist

于 2013-01-13T04:19:16.640 に答える