glib2哈希表:GINT_TO_POINTER宏

时间:2014-02-27 01:55:29

标签: glib

我不认为我理解glib2的哈希表,尤其是当键和值都是整数时如何正确使用GINT_TO_POINTER。我认为这是在创建新哈希表时使用g_int_hashg_int_equal的用例。但是,以下代码段将会出现错误。

#include <glib.h>

int main(void) {
    GHashTable * freq = g_hash_table_new(g_int_hash, g_int_equal);
    for (int i = 0; i < 10; i++) {
        g_hash_table_insert(freq, GINT_TO_POINTER(i), GINT_TO_POINTER(0));
    }
    g_hash_table_destroy(freq);
}

我知道两种方法可以做到正确:一种是创建一个这样的哈希表而不改变其他任何东西:

   GHashTable * freq = g_hash_table_new(g_direct_hash, g_direct_equal);

第二种方法是,保持创建不变,但明确为键和值分配空间:

   int * key = malloc(sizeof(int));
   int * value = malloc(sizeof(int));

然后通过将其转换为(gpointer)来插入键和值。

第二种方法似乎是做一个关键值对的一种非常繁琐的方法,这是做 int到int 映射的正确方法吗?感谢。

1 个答案:

答案 0 :(得分:3)

g_int_hash()的文档说:

  

请注意,此函数会直接指向gint,而不是gint上的指针:如果您的哈希表的键格式为GINT_TO_POINTER (n),请改用g_direct_hash()。< / p>

是的,如果您正在进行int-to-int映射,则应使用g_direct_hash()g_direct_equal()GINT_TO_POINTER()