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

10-09 17:23