我有两个这样的结构:
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来迭代条目,它看起来至少是“工作”而没有崩溃,尽管我不确信所有的值都是相同的。
最佳答案
看起来基本上是对的。有几件事要再核对一下
检查在创建my_item1时,在HASH_ADD_STR之前,是否将my_item1->item2_映射初始化为空
检查my_item2->stringkey是否以空结尾并且在HASH_FIND_STR之前小于MAX_SIZE
试着把它放在valgrind下面看看有没有其他线索
如果你发现什么,请告诉我们。
特洛伊
关于c - UTHash多级哈希表在HASH_FIND_STR上崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15915187/