C 递归中的g_哈希表查找

C 递归中的g_哈希表查找,c,linux,C,Linux,我编写了以下玩具程序来测试递归中的“g_hash_table_lookup()”: 然而,事实并非如此。相反,我得到了以下结果: Level=0, Returned Value=test_value Level=1, Returned Value=([��`� Level=2, Returned Value=(null) Level=3, Returned Value=(null) 如果有人能解释一下为什么我只能在递归的插入层次上检索哈希表中插入的值,我将不胜感激 谢谢 丹尼尔来自: 请注意

我编写了以下玩具程序来测试递归中的“g_hash_table_lookup()”:


然而,事实并非如此。相反,我得到了以下结果:

Level=0, Returned Value=test_value
Level=1, Returned Value=([��`�
Level=2, Returned Value=(null)
Level=3, Returned Value=(null)
如果有人能解释一下为什么我只能在递归的插入层次上检索哈希表中插入的值,我将不胜感激

谢谢

丹尼尔

来自:

请注意,插入GHashTable时不会复制键或值,因此它们必须在GHashTable的生存期内存在

这意味着:

g_hash_table_insert(htable,&key[0],&value[0]);
不复制
,哈希表只存储指针。但是,
在堆栈上分配:

char key[] = "test_key";
char value[] = "test_value";
因此,您的
&键[0]
&值[0]
指针仅在函数期间有效。一旦退出递归,就会有一个充满无效指针的哈希表,这会给您带来一堆垃圾和未定义的行为


在调用
g_hash_table_insert
时,您应该同时使用释放键和值的函数,然后复制键和值;您可以使用来复制键和值,并且作为
key\u destroy\u func
value\u destroy\u func
参数,用于
g\u hash\u table\u new\u full

非常感谢,我应该考虑一下。据我所知,“g_hash_table_new_full()”是否保留键和值的副本而不是指向它们的指针?或者是由“g_strdup()”创建的副本在被“g_free”显式释放之前一直保持“活动”?@Dani:不,哈希表只是复制指针,而不是它们指向的指针
g_strdup
几乎是一个
malloc
strcpy
,这就是为什么需要使用长格式的哈希表构造函数(具有两个释放函数的版本)或确保手动清理内存。
g_hash_table_insert(htable,&key[0],&value[0]);
char key[] = "test_key";
char value[] = "test_value";