GLib哈希表查找失败

时间:2013-06-01 01:09:06

标签: c glib

我正在尝试学习如何使用glib中的GHashTable容器,我在查找中看到了一些奇怪的行为。问题可归结为以下几点:

#include <glib.h>
#include <stdio.h>

GHashTable *h;
char val[]  = {'H', 'E', 'L', 'L', 'O',0};

void f1()
{
   int k;
   scanf("%d", &k);
        g_hash_table_insert(h, &k, val);
}

void f2()
{
   int m;
   f1();
   scanf("%d", &m);
   gpointer *p = g_hash_table_lookup(h, &m);
   printf("%s\n", (const char*)p);
}

int main()
{
   h = g_hash_table_new(g_int_hash, g_int_equal);
   f2();
   return 0;
}

在函数f2中,g_hash_table_lookup的结果为0x00。但是,如果我在调用f1之前从main调用f2并跳过从f1调用f2,代码将按预期工作并打印“HELLO”。

我想我在这里遗漏了一些非常基本的东西。如何在glib中正确执行哈希表插入和查找?

2 个答案:

答案 0 :(得分:1)

我相信GLib GHashTable只接受指针键。它不需要整数键。使用g_int_hash键函数创建哈希表时,需要使用指向gint对象的指针来获取它,而不仅仅是普通的int。而不是

g_hash_table_lookup(h, m)

g_hash_table_lookup(h, g_new(gint, 1))

请参阅http://blog.sensecodons.com/2012/01/glib-ghashtable-and-gdirecthash.html

答案 1 :(得分:1)

您应该使用转化宏GINT_TO_POINTER,请参阅此处:https://developer.gnome.org/glib/2.34/glib-Type-Conversion-Macros.html

这样:

#include <glib.h>
#include <stdio.h>

GHashTable *h;
char val[]  = {'H', 'E', 'L', 'L', 'O',0};

void f1()
{
   int k;
   scanf("%d", &k);
   g_hash_table_insert(h, GINT_TO_POINTER(k), val);
}

void f2()
{
   int m;
   f1();
   scanf("%d", &m);
   gpointer *p = g_hash_table_lookup(h, GINT_TO_POINTER(m));
   printf("%s\n", (const char*)p);
}

int main()
{
   h = g_hash_table_new(g_int_hash, g_int_equal);
   f2();
   return 0;
}