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行,并评论了热线(是的,整个地方有很多白人步伐。我知道,我很可怕。)
答案 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)
。