我对此代码有疑问。我无法得到预期的答案。我搜索了此内容,但找不到任何内容。我找不到我的错误..
这是我与g_hash_table一起工作的代码
# include <stdio.h>
# include <glib.h>
# include <stdlib.h>
GHashTable *hash = NULL;
int check_sth_blacklist(char *sth)
{
return g_hash_table_contains(hash,sth);
}
main()
{
hash = g_hash_table_new(g_str_hash,g_str_equal);
char *sth = (char*) malloc(32);
scanf("%s",sth);
g_hash_table_add(hash,sth);
scanf("%s",sth);
printf("%d\n",check_sth_blacklist(sth + sizeof(char)*2));
free(sth);
}
在我的输入中,我正在写:
cde
abcde
我认为
cde
字符串将添加到g_hash_table中。然后当我在cde
中请求字符串abcde
时,它返回0值。 最佳答案
我相信,当您将您的malloc字符串传递给g_str_hash
下的GHashTable时,您会将字符串的控制权移交给了哈希表-可以在时间到时释放它,依此类推。您不应该再使用该空间分配!
创建一个新字符串进行比较:
#include <stdio.h>
#include <glib.h>
#include <stdlib.h>
#include <string.h>
GHashTable *hash = NULL;
int check_sth_blacklist(char *sth)
{
return g_hash_table_contains(hash, sth);
}
int main()
{
hash = g_hash_table_new(g_str_hash, g_str_equal);
char *sth = (char*) malloc(32);
scanf("%s", sth);
g_hash_table_add(hash, sth);
char *nth = (char*) malloc(32);
scanf("%s", nth);
printf("%d\n", check_sth_blacklist(nth + 2));
free(nth);
g_hash_table_destroy(hash);
return 0;
}
让散列管理您放入其中的任何字符串(键或值),当散列本身销毁时,所有字符串都应独立且可释放。运行时,这给了我:
bash-3.2$ ./a.out
cde
abcde
1
bash-3.2$