-1

簡単なリンクリストを実装しました。見よ!

struct List{
    List *next;
    bool last;
    string data;
};

List *head;

ただし、関数を使用してビルドしようとすると、それをトラバースすると、プログラムがエラー 0x00005 でクラッシュしました (これはメモリ エラーですよね?)。ビルド関数ではすべて問題ないように見えますが、それ以外の場合はエラーがスローされます。リストを作成した関数は次のとおりです。

void mkList(List *ptr, int num){
    if(num != 0){
        ptr = new List;
        ptr->data = "asd";

        if(num == 1)ptr->last = true;
            else ptr->last = false;

        mkList(ptr->next,num-1);
    }
}

リストをトラバースしようとした方法はメインにあります:

int main(){
    mkList(head,5);

    List *ptr = head;

    while(!ptr->last){
        cout << ptr->data <<endl;
        ptr = ptr->next;
    }
    return 0;
}

2 番目の要素まではすべて正常に動作しているように見えます。最初の要素のデータをカウントすることもできます。私は何を間違えましたか?

4

3 に答える 3

0

ポインタの概念を再検討する必要があると思います。ポインタは、別の変数のメモリ アドレスを保持する変数であることを理解する必要があります。

次のようなコードがある場合:

void foo(int a){
 a = 5;
}

// ...

int b = 0;
foo(b)

最後の行の後に b が 5 になるとは思わないでしょう? ポインターと同じです。

void foo(List *a){
 a = new List;
}

// ...

List *b;
foo(b);

b にはまったく影響しません。ここで、別の関数から b の値を設定したい場合は、b へのポインターを渡すことができます (ポインターは変数であるため、ポインターへのポインターを持っていてもまったく問題ありません)。

void foo(List **a){
 a = new List;
}

// ...

List *b;
foo(&b);
// now b will point to the newly allocated memory

これを理解すれば、このコードを修正するのは非常に簡単です。

于 2013-04-03T20:09:18.853 に答える