我对此代码有疑问。我无法得到预期的答案。我搜索了此内容,但找不到任何内容。我找不到我的错误..

这是我与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$

10-04 21:53