0

最近、リンクされたリストを試しているときに問題に遭遇しました。関数を使用して、データ フィールドに文字列を持つ新しいノードをリンクすると、機能しません。つまり、関数 (linkin() 以下を参照) が を返すと、文字列 (関数に対してローカル) が破棄され、文字列フィールドが初期化されていないように見えます。

ただし、 int でこれとまったく同じ操作を行うと、問題なく動作するようです。私が使用したコードは以下のとおりです (int バージョンですが、他のバージョンを表示するには、int の代わりに val を文字列にします)。誰かが私に何が起こっているのか説明してもらえますか?

ありがとう!

struct testlist {
    int val;
    testlist *next;
};
void linkin ( testlist *a );

int main() {

    testlist test;

    linkin(&test);
    cout << test.next->val <<endl;
}


void linkin ( testlist *a )
{
  testlist b;
  b.val=1;
  a->next = &b;
  cout << a->next->val <<endl;
}
4

2 に答える 2

4
testlist b;
a->next = &b;

a->next関数から戻った直後に破棄されるローカル一時オブジェクトを指しています。関数から逆参照した後、未定義の動作を呼び出します。

これは未定義の動作であり、機能する場合もあれば、機能しない場合もあります。


また、C++ には、リンクされたリストがあります: std::list. 一方、std::unique_ptrベア ポインターの代わりに などのスマート ポインターを使用できます。私はあなたのコンテナに基づいてスマートポインタを書きました:

struct List
{
    int val;
    unique_ptr<List> next;
};

void linkin (List &a)
{
    unique_ptr<List> b(new List);
    b->val = 1;
    a.next = move(b); // After move you can't use b anymore
    cout << a.next->val << endl;
}

int main()
{
    List test;
    linkin(test);
    cout << test.next->val <<endl;
}
于 2013-10-29T15:37:48.387 に答える