1

ポインタのベクトルを作成しようとすると、各ポインタがNULLに設定されます。次に、ベクトルの特定の部分を、割り当てたノードに接続します。ミスマッチに苦労しています。また、すでに存在していたコンテンツを新しいノードの後ろに追加したいと思います。どんなフィードバックでも親切です。セグメンテーション違反が発生し続けます。

struct Node{
    int x;
    Node* rest;
};

void HTadd (int k, Node *ptr)
{

    Node* temp = new Node
    temp->x = k;
    temp->rest= ptr;
    ptr = temp;
}


int main ()
{
    vector <Node *> tableP;
    for (int i = 0; i < 10; i++){
    tableP.push_back(NULL);}

    Node * buggy = tableP[0];
    HTadd(26, buggy);
    cout << buggy->key << endl;


    return 0;
}
4

3 に答える 3

4

の関数宣言を変更して、HTAddへのポインタからへのポインタを取り込むことに注意してくださいNode。ベクトルの最初の要素である、の内容を変更したかったので、にNode*渡す必要があります。Node**HTAdd

編集:私の元のコードは、追加しようとしているノードに接続される0番目のベクトル要素を実際には変更しません。これがあなたがそれをする方法です。ご覧のとおり、最後の2つのステートメントは、同じアドレスを指すcoutベクトルとの0番目の要素の内容を出力します。buggy

#include <iostream>
#include <vector>

using namespace std;

struct Node {
    int x;
    Node* rest;
};

void HTadd (int k, Node **ptr) {
    Node* temp = new Node;
    temp->x = k;
    temp->rest= *ptr;
    *ptr = temp;
}


int main ()
{
    vector<Node*> tableP;

    for (int i = 0; i < 10; i++){
        tableP.push_back(NULL);
    }


    HTadd(26, &tableP[0]);
    Node *buggy = tableP[0];

    cout << tableP[0]->x << endl;
    cout << buggy->x << endl;

    cout << tableP[0] << endl;
    cout << buggy << endl;


    return 0;
}
于 2013-03-14T04:33:42.780 に答える
3

HTaddの定義をそのまま使用します

void HTadd (int k, Node *&ptr)

あなたがしたようにそれを普通に呼んでください。

理由:変数を参照するということは、同じ場所に異なる名前を付けることを意味します。使用する場合Node * ptrは、値を渡すだけです。つまり、 (である)ptrの値のコピーを持つローカル変数です。あなたがすることは影響しません。したがって、が変更されたときに変更を加えるには、参照を渡します。したがって、eは次のように宣言する必要がありますbuggynullptrbuggybuggyptrbuggyptrreference to a pointer to Node

編集:以下のコメントのNode * buggy = tableP[1];ように、バギーはによって返されたアドレスを保持しますnew node(tableP [1]はこのアドレスを保持します)。の呼び出し後、バギーには(coz temp = new node)HTadd(26,buggy);によって新しい値が与えられます。ptr = tempバギーは他の何かを指しますが、tableP [1]は変更されていません。つまりtableP[1]->restNULLtableP [1]->rest->xには意味がありません。したがって、セグメンテーション違反。なぜtableP[1]がハングしていないのですか?coz tableP [1]は1つの変数であり、buggy両方ともNode *型の別の変数であるため、Node * buggy = tableP[1]jusはtableP[1]の内容をバギーにコピーします。

于 2013-03-14T05:12:00.000 に答える
3

バギーはNULLであり、あなたはそれを延期しています。ポインタを参照ではなく値で渡しているため、ポインタの内容は変更されますが、ポインタが指すものは変更されません。HTAddを変更して、ポインターへの参照を2番目のパラメーターとして使用します。

于 2013-03-14T04:35:07.897 に答える