【问题标题】:UTHash multilevel hash table crashing on HASH_FIND_STRUTHash 多级哈希表在 HASH_FIND_STR 上崩溃
【发布时间】:2013-04-01 15:57:42
【问题描述】:

我有两个这样的结构:

struct item2_map{
char stringkey[MAX_SIZE];
UT_hash_handle hh;
}

struct item1_map{
int key1;
struct item2_map *item2_map;
UT_hash_handle hh;
}

在我的代码中,我做了这样的事情

struct item1_map *retrieved;
struct item2_map *found_value, *tmp;

HASH_FIND(hh, hash_head, key1, &someintvalue, sizeof(int), retrieved)
if(retrieved==NULL)
{
    HASH_ADD(hh, hash_head, key1, sizeof(key1), my_item1);
    my_item1->item2_map = NULL;
    HASH_ADD_STR(my_item1->item2_map, stringkey, my_item2);
} else 
{
    //THIS WORKS
    HASH_ITER(hh, retrieved->item2_map, found_value, tmp)
    { //do something }

    //THIS SEG FAULTS
    HASH_FIND_STR(retrieved->item2_map, &my_item2->stringkey, found_value)
}

这似乎给了我 HASH_FIND_STR() 的段错误。有什么我做错了吗?在此示例中,假设 my_item1 和 my_item2 来自其他地方并且是有效的。我想使用 stringkey 作为键来查找值。

我在条件的IF 部分放了一个断点,所以我知道一开始没有找到它,然后在第二次找到该键时,进入了else 块。

有趣的是,如果我使用 HASH_ITER 遍历条目,它似乎“工作”至少不会崩溃,尽管我不相信所有的值都是相同的。

【问题讨论】:

    标签: c hash hashmap uthash


    【解决方案1】:

    看起来基本正确。有几件事要仔细检查

    • 检查 my_item1->item2_map 在创建 my_item1 时是否在 HASH_ADD_STR 之前初始化为 NULL
    • 检查 my_item2->stringkey 是否以 null 结尾并且在 HASH_FIND_STR 之前小于 MAX_SIZE
    • 尝试在valgrind下运行看看有没有其他线索

    如果您有任何发现,请告诉我们。

    特洛伊

    【讨论】:

    • 所以事实证明我发现了问题所在。在我的代码中,my_item2 是通过重复使用相同的结构而不是每次都分配一个新结构来填充的。这给了我不同的键值,但我最终需要在将新结构插入哈希之前对其进行 memcpy,这似乎已经解决了问题。
    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 2019-09-29
    • 2021-03-14
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多