我正在使用哈希表实现UThash。
我正在使用原始元素插入元素:
HASH_ADD(hh,hash_table,key,keylen,elem);
并使用原语检索元素:
HASH_FIND(hh,hash_table,key,keylen,elem);
由于某种原因,我不知道,当我调用函数时,哈希查找的行为正在被修改。也就是说,uthash找不到表中存在的元素。
我怀疑内存已在某种程度上受到损害。
触发此失败的函数无需执行任何代码即可使UThash失败:
//Note: ct = custom_type
int func1(ct1 *ptr1, ct2 *ptr2, ct3 *ptr3,char **buffer,size_t *size)
{
HASH_FIND(...) //does not work
/**
* code
*/
return 0;
}
int func2(ct1 *ptr1,ct2 *ptr2,ct3 *ptr3)
{
char *buffer;
size_t buf_size;
/**
* code
*/
HASH_FIND(...) // works!
if(func1(ptr1,ptr2,ptr3,&buffer,&buf_size)){
//code
}/*error*/
return 0;
}
int func3(ct1 *ptr1,ct2 *ptr2,ct3 *ptr3)
{
char *buffer;
size_t buf_size;
HASH_FIND(...) // works!
if(func1(ptr1,ptr2,ptr3,&buffer,&buf_size)){
//code
}/*error*/
/**
* code
*/
return 0;
}
因此,在func2()和func3()中,都会发生相同的行为。我调用func1()后,hash_find()开始失败。
其余所有代码均完美,正确地执行。
我显而易见的问题是什么会导致此类故障?
感谢您的阅读,并可以随时询问任何其他信息。
最佳答案
这可能是由于将多个具有相同键的项添加到哈希中引起的。如果您使用uthash,则需要确保您的结构中没有重复的键,或者提供一个包装器功能,该功能将旧项替换为新项。否则,结构的行为将不可预测,并可能导致您描述的故障。
从uthash user guide:
如果您有可能会生成重复的密钥
程序,您必须先明确检查其唯一性,然后再添加
哈希键。如果密钥已经在哈希中,则只需
修改哈希中的现有结构,而不是添加项目。
将具有相同键的两个项目添加到哈希表是错误的。
关于c - 调用函数会使UThash失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13827769/