如何从GHashTable访问gpointer指向的GString

时间:2012-02-18 14:48:16

标签: c glib

C代码

#include <glib.h>
//...
GHashTable *hash = g_hash_table_new(NULL, NULL);
GString val;

g_hash_table_insert(hash, (int*)5, g_string_new("Bar"));
val = g_hash_table_lookup(hash, (int*)5); // line 10

printf("Foo ~ %s\n", val->str); // line 16

if (NULL == val) // line 18
    printf("Eet ees null!\n");

哪个产生了:

  
    

ctest.c:10:错误:分配中的不兼容类型

         

ctest.c:16:错误:' - &gt;'的无效类型参数(有'GString')

         

ctest.c:18:错误:无效操作数到二进制==(有'void *'和'GString')

  

我做错了什么? :(

编辑:有些人可能会感到困惑并问自己“她为什么不使用g_string_printf()?”

因为我需要访问gchar *str,所以打印只是我“调试”它的方式。

编辑:添加第18行,并评论了热线(是的,整个地方有很多白人步伐。我知道,我很可怕。)

3 个答案:

答案 0 :(得分:2)

函数g_string_new返回GString *。这就是存储在哈希中的内容。函数g_hash_table_lookup返回void *。你可能想要这样的东西:

GString *val;
val = g_hash_table_lookup(hash, (int*)5);
printf("Foo ~ %s\n", val->str);

答案 1 :(得分:1)

GString结构声明为:

struct GString {
  gchar  *str;
  gsize len;
  gsize allocated_len;
};

所以要访问字符串只需使用.运算符:

printf("%s\n", val.str)

同样将(int*) 5作为参数传递给您的函数可能是错误的。这会将整数值5转换为指针。但你想要的是指向int int值为5的指针。

要执行此操作,您可以使用复合文字:&(int) {5}或使用指向int类型对象的指针:

int bla = 5;  // and you pass &bla as the argument of your function

答案 2 :(得分:0)

val->str应为val.str - 它不是指针。这也意味着您无法执行if (NULL == val)