在g_hash_table

时间:2017-02-17 10:41:55

标签: c hashtable glib

我在C中有一些代码,我想使用int作为键和gnome哈希表中的值。但如果我写:

GHashTable* table = g_hash_table_new(g_direct_hash, g_direct_equal);
int tmp = 0;
int value = 255;
g_hash_table_insert(table, (gpointer)tmp, (gpointer) 255);

我收到一些关于从不同大小的整数转换指针和应用程序返回分段错误的警告。我知道这可以通过指针完成,但我想知道是否有一种方法可以直接使用int来优化过程。我也开放尝试新的解决方案(总是在C中使用gnome哈希表),性能更好。我只需创建一个哈希表并用一定数量的键填充相同的值,然后在后一阶段与其中的值进行一些比较,最后用固定值对其中的每个值进行比较。 / p>

2 个答案:

答案 0 :(得分:3)

您应该使用GINT_TO_POINTER宏:

g_hash_table_insert(table, GINT_TO_POINTER(tmp), GINT_TO_POINTER(255));  

这样可以摆脱warning: cast to pointer from integer of different size警告。

答案 1 :(得分:3)

您有两种选择:

  • g_direct_hash()G_INT_TO_POINTER()键一起使用;或
  • 使用g_int_hash()指向整数键的指针。

所以在第一种情况下,那就是:

int tmp = 0;
int value = 255;

GHashTable *table = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, NULL);
g_hash_table_insert (table, GINT_TO_POINTER (tmp), GINT_TO_POINTER (value));

在第二个中,它是:

int tmp = 0;
int value = 255;

GHashTable *table = g_hash_table_new_full (g_int_hash, g_int_equal, NULL, NULL);
g_hash_table_insert(table, &tmp, GINT_TO_POINTER (value));

虽然你必须保证&tmp指向的密钥在其条目位于哈希表中时不会改变 - 所以这只适用于已分配的密钥,如下所示:

int tmp = 0;
int *key = g_new0 (gint, 1);
*key = tmp;
int value = 255;

GHashTable *table = g_hash_table_new_full (g_int_hash, g_int_equal, g_free, NULL);
g_hash_table_insert(table, key, GINT_TO_POINTER (value));

因此,第二个选项更有意义,例如,如果您想根据现有堆分配结构中的整数字段的值来键入哈希表,该结构将作为哈希表条目中的值存储(所以你不需要为密钥额外分配。

请注意,在这两种情况下,都要对要存储的值使用GINT_TO_POINTER(),因为值始终被视为指针,并且与您正在使用的哈希和相等函数无关。

另请注意,使用g_hash_table_new_full()并将NULL传递给最后两个参数(除了第三个示例)之外,更清楚的是哈希表不会获取您传递的键和值的所有权它。 (最后两个参数给出了键和值的自由函数。)