首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用函数会使UThash失败

调用函数会使UThash失败
EN

Stack Overflow用户
提问于 2012-12-11 20:13:58
回答 5查看 1.3K关注 0票数 3

我正在使用哈希表实现UThash。

我使用原语插入元素:

代码语言:javascript
复制
    HASH_ADD(hh,hash_table,key,keylen,elem);

并使用原语检索元素:

代码语言:javascript
复制
    HASH_FIND(hh,hash_table,key,keylen,elem);

由于某些原因我不知道,当我调用一个函数时,散列查找的行为正在被修改。也就是说,uthash没有找到表中存在的元素。

我怀疑记忆在某种程度上被破坏了。

触发此失败的函数不需要执行任何代码就可以使UThash失败:

代码语言:javascript
复制
    //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()中都会发生相同的行为。hash_find()在调用func1()后开始失败。

所有其余的代码都完美而正确地执行。

我最明显的问题是什么会导致这种类型的失败?

感谢您的阅读,并随时询问任何其他信息。

EN

回答 5

Stack Overflow用户

发布于 2012-12-29 16:43:15

这可能是通过向散列中添加几个具有相同键的项造成的。如果使用uthash,则需要确保结构中没有重复的键,或者提供一个包装器函数,它将用新项替换旧项。否则,结构的行为是不可预测的,并可能导致您描述的失败。

来自uthash用户指南

如果您的程序有可能生成重复的键,则必须在将键添加到哈希之前显式检查其唯一性。如果键已经在哈希中,则可以简单地修改散列中的现有结构,而不是添加项。在哈希表中添加两个具有相同键的项是错误的。

票数 2
EN

Stack Overflow用户

发布于 2015-03-17 15:10:29

这是因为您是在散列指针,而不是数据。

使用克耶PTR

票数 0
EN

Stack Overflow用户

发布于 2016-02-03 09:24:40

当我的密钥具有未签名字符类型时,在用int HASH_FIND_INT替换它之后,我也遇到了类似的问题。进一步的考察表明,符号字符无符号字符是不合适的,而short int无符号短int似乎也很好。

对于哈希函数计算算法来说,大概有8位是不够的。注意,带有无符号字符操作的原始代码是间歇性的,代码在某些构建中工作,而在其他构建中不工作(与uthash无关的更改)。

结论:使用符号的int键进行HASH_FIND_INT的正确手术,或使用短int无符号短,则由您自己承担风险。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13827769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档