1

これに似たものはどこにも見つかりませんでした。ハッシュ テーブルのオブジェクト (リンク リスト) へのポインターの配列があります。

LinkList * table[TABLE_SIZE];
for (int i = 0; i < TABLE_SIZE; i++)
    table[i] = NULL;

ハッシュ テーブル クラスの関数の 1 つで、配列LinkList内のオブジェクトの関数の 1 つを呼び出す必要があります。table私はそれを次のように呼んでいます:

void HashMap::add_customer(string first, string last, string phone) {   
    int hash = get_hash(phone);
    if (table[hash] == NULL) {
        table[hash] = new LinkList;
    }
    table[hash]->add_customer(first, last, phone); // I HATE THIS LINE
}

すべてが正常にコンパイルされますがtable[hash]->add_customer()、実行時に行を実行するとSegmentation Faultエラーが発生します。この行がコメントアウトされている場合、エラーは発生しませんが、ハッシュ テーブルに顧客を追加することはできません。これは正しい構文ではありませんか?

4

3 に答える 3

2

ポインターの配列を NULL に初期化する必要があります。これは、ポインターがスタック/ヒープまたはジャンク値のある場所に割り当てられるためです ....

LinkList * table[TABLE_SIZE];
memset(table, NULL, sizeof(LinkList *) * TABLE_SIZE);

正しく初期化したと仮定して、ハッシュを確認し、実際にハッシュ < TABLE_SIZE であることを主張してください

これを試して:

 int hash = get_hash(phone) % TABLE_SIZE;
于 2012-06-12T23:45:06.230 に答える
0

このスニペットは、ハッシュ マップの動作に関して正しく見えます。LinkList 実装の add_customer メソッドを確認します。リンクされたリストが意図したとおりに機能することを確認するために、このハッシュ マップの外でリンクされたリストを使用してみてください。

于 2012-06-12T23:45:26.173 に答える
0

これを試して:

LinkList * table[TABLE_SIZE] = {};

それはそもそもあなたのポインタを無効にします。


get_hash の戻り値が TABLE_SIZE より小さいことを確認できますか? アサートなどを追加します。

于 2012-06-12T23:46:14.007 に答える