0

この関数はハッシュ テーブルの一部です。検索するハッシュ リストとキーを渡します。

int HashSearch (Hash_list h, char* key)
{
    struct ent *x = (struct ent *)malloc(10*sizeof(struct ent));
    for (x = h->table[hash(key, h->size)]; x!=0; x=x->next) {
        if (strcmp(x->pos, key)==0) {
            return x->num;
        }
    }
    return -1;
}

残念ながら、実行しようとすると、valgrind でエラーが発生し続けます。

==1741== Conditional jump or move depends on uninitialised value(s)
==1741==    at 0x4018DE: HashSearch (Hash.c:81)
==1741==    by 0x400FA7: function (Nine13.c:181)
==1741==    by 0x4009D8: main (Nine13.c:54)
==1741== 
==1743== Conditional jump or move depends on uninitialised value(s)
==1743==    at 0x4018DE: HashSearch (Hash.c:81)
==1743==    by 0x400FA7: function (Nine13.c:181)
==1743==    by 0x4009D8: main (Nine13.c:54)
==1743==

(81 行目は「for」で始まるコード行です)。

渡された と ハッシュ リストの両方を初期化したような気がstruct entします。何が問題なのですか?

4

3 に答える 3

2

this other questionに基づいて、問題は実際にはすべてのエントリh->tableが初期化されていないことにあるようです。callocor memsetonを使用tableすると非常に高い確率で問題が解決しますが、技術的には移植性がないことに注意してください。0は null ポインターと等しいと評価されることが保証されていますが、ビット パターンがすべて s であるとは限りません0。また、他のスレッドと上記の私のコメントで指摘されているように、複雑なデータ型の場合、他の「空の」値が必要になることがよくあります。

于 2013-04-20T05:19:27.443 に答える
1

コメントへの返信から、問題は関数の外部にあり、関数内で使用されている項目の 1 つが適切に初期化されていないようです。これ以外では、コードの次のセクションでメモリ リークが発生します。

struct ent *x = (struct ent *)malloc(10*sizeof(struct ent));
           ^^
  for (x = h->table[hash(key, h->size)]; x!=0; x=x->next) {
       ^^^^^

メモリを割り当ててからxすぐにループで再割り当てxしていforます。おそらくこれが意図したことです。

struct ent *x ;
  for (x = h->table[hash(key, h->size)]; x!=0; x=x->next) {
于 2013-04-19T09:13:56.200 に答える