2016-03-30 2 views
0

У меня проблема с этим кодом. Я не могу получить ожидаемый ответ. Я искал это, но ничего не могу найти. Я не могу найти свою ошибку ..g_hash_table_contains возвращает неожиданное значение

Вот мой код работает с 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.

ответ

0

Я верю, что когда вы передаете строку malloc'd в GHashTable под номером g_str_hash, вы переходите на управление строкой на хэш-таблицу - это зависит от нее, чтобы освободить ее, когда придет время, и т. Д. I.e. вы не должны использовать это пространство снова!

Создать новую строку для сравнения:

#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; 
} 

Пусть хэш управлять все строки, введенные в него (ключ или значение), все из которых должны быть независимыми и freeable, когда сам хэш уничтожается. При пробеге это дает мне:

bash-3.2$ ./a.out 
cde 
abcde 
1 
bash-3.2$ 
+0

thx много. Я почти понял это. thx для того, чтобы сделать мой мозг ярким)) – merdan

Смежные вопросы