1

我正在尝试学习如何使用 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并跳过调用f1from f2,则代码将按预期工作并打印“HELLO”。

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

4

2 回答 2

1

我相信 GLibGHashTable只接受作为指针的键。它不需要整数键。当您使用 g_int_hash 键函数创建哈希表时,您需要使用指向 gint 对象的指针从中获取,而不仅仅是普通整数。所以而不是

g_hash_table_lookup(h, m)

尝试

g_hash_table_lookup(h, g_new(gint, 1))

http://blog.sensecodons.com/2012/01/glib-gashtable-and-gdirecthash.html

于 2013-06-01T01:50:57.437 回答
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;
}
于 2013-07-16T22:19:12.710 回答