gpt4 book ai didi

调用函数会使 UThash 失败

转载 作者:行者123 更新时间:2023-12-04 10:42:09 25 4
gpt4 key购买 nike

我正在使用哈希表实现 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 :

If there’s any chance that duplicate keys could be generated by your program, you must explicitly check the uniqueness before adding the key to the hash. If the key is already in the hash, you can simply modify the existing structure in the hash rather than adding the item. It is an error to add two items with the same key to the hash table.

关于调用函数会使 UThash 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13827769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com