UTHash多层哈希表在HASH_FIND_STR上崩溃

时间:2013-04-10 00:59:05

标签: c hash hashmap uthash

我有两个这样的结构:

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()上给了我一个seg错误。有什么我做错了吗?在此示例中,假设my_item1和my_item2来自其他位置且有效。我想使用stringkey作为查找值的键。

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

有趣的是,如果我使用HASH_ITER迭代条目,它似乎“工作”至少没有崩溃,虽然我不相信所有的值都是相同的。

1 个答案:

答案 0 :(得分:3)

看起来基本正确。一些要仔细检查的事情

  • 检查my_item1-> item2_map在创建my_item1时,在HASH_ADD_STR
  • 之前初始化为NULL
  • 检查my_item2-> stringkey是否为空终止且小于MAX_SIZE之前HASH_FIND_STR
  • 尝试在valgrind下运行它以查看是否还有其他线索

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

特洛伊