0

まず、key=str1,value=header_buff を挿入します

次に、str2 を使用してポインターを検索します。

3 番目に、malloc したが失敗したポインターを解放します。なんで?

#include <stdio.h>
#include <glib.h>
int main()
{
  GHashTable *hash; ///define my hashtable

  char str1[20] = "key";
  char str2[20] = "key";

  char *header_buff = (char*) malloc(sizeof(char) * 1024 * 1024);
  memcpy(header_buff, "value", 5);
  printf("%p\n", header_buff);

  hash = g_hash_table_new(g_str_hash, g_direct_hash); ///here I use (g_str_hash, g_direct_hash)
  g_hash_table_insert(hash, str1, header_buff); /// insert the str1 as key

  char * c = (char*) g_hash_table_lookup(hash, str2); ///use str2 to find the value
  if (c)
  {
    printf("%s\n", c);   ///can print the string "value"
    printf("%p\n", c);
    free(c); ///the same address? but I can't free the mem!
    c = NULL;
  }
  return 0;
}
4

2 に答える 2

3

ドキュメントから:

GHashTable *        g_hash_table_new  (GHashFunc hash_func,
                                       GEqualFunc key_equal_func);

したがって、1 つのハッシュ関数と 1 つの等号関数ではなく、2 つのハッシュ関数を使用しているため機能ません。

これがどのように見えるかです。

table = g_hash_table_new (g_str_hash,g_str_equal);

同じ文字が含まれていても、stringの同じインスタンスg_direct_*を使用しないと、機能しない可能性があることに注意してください。ポインタ直接比較します。gchar

于 2013-08-17T20:24:15.500 に答える
-1

お使いのプラットフォームで #include と sizeof(int) != sizeof(void *) が欠落していると思われます。

于 2013-08-17T19:57:31.617 に答える