我不认为我理解glib2的哈希表,尤其是当键和值都是整数时如何正确使用GINT_TO_POINTER。我认为这是在创建新哈希表时使用g_int_hash
和g_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 映射的正确方法吗?感谢。
答案 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()
。