0

uthashでハッシュマップを作成したい。

キーと値を、次のような String と size_t を含む構造体にしたい:

typedef struct hash_ptr {
    char* string;
    size_t len;
}hash_ptr;

ハッシュ テーブル自体は次のようになります。

typedef struct hash_map_entry {
    struct hash_ptr *key;
    struct hash_ptr *value;
    UT_hash_handle hh;
}hash_map_entry;

マップに新しいエントリを追加するために、add_entry() という新しい関数を書きました。

void add_entry(hash_map_entry *map, hash_ptr *key, hash_ptr *value) {
    hash_map_entry *entry;
    HASH_FIND(hh, map, key, sizeof *key, entry);
    if (entry == NULL) {
        entry = (hash_map_entry*) malloc(sizeof *entry);
        memset(entry, 0, sizeof *entry);
        entry->value = value;
        entry->key = key;
        HASH_ADD(hh, map, key, sizeof *key, entry);
    }
}

ただし、初期化して add_entry() を呼び出した後...

hash_map_entry *map = NULL;

hash_ptr *key = (hash_ptr*) malloc(sizeof *key);
memset(key, 0, sizeof *key);
key->string = "Is this the Krusty Krab?";
key->len = strlen(key->string);

hash_ptr *value = (hash_ptr*) malloc(sizeof *value);
memset(value, 0, sizeof *value);
value->string = "No, this is Patrick!";
value->len = strlen(value->string);

add_entry(map, key, value);

... HASH_FIND は、追加されたエントリを見つけられません:

hash_map_entry *find_me;
HASH_FIND(hh, map, key, sizeof *key, find_me);

find_me は NULL です。

公式ユーザーガイドの構造体をキーとして使用するための手順に従いました。

どこが間違っていますか?

4

1 に答える 1