g_hash_table_contains返回意外值

时间:2016-03-30 15:30:20

标签: c

我的代码有问题。我无法得到预期的答案。我搜索了这个,但我找不到任何东西。我无法找到我的错误..

这是我的代码使用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值。

1 个答案:

答案 0 :(得分:0)

我相信当你将malloc&#39字符串传递给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$