【问题标题】:glib2 hash table: GINT_TO_POINTER macroglib2 哈希表:GINT_TO_POINTER 宏
【发布时间】:2014-02-27 01:55:29
【问题描述】:

我不认为我理解 glib2 的哈希表,尤其是当 key 和 value 都是整数时如何正确使用 GINT_TO_POINTER。我认为这是在创建新哈希表时使用 g_int_hash 和 g_int_equal 的用例。但是下面的sn-p会出现seg faults。

#include <glib.h>

int main(void) {
    GHashTable * freq = g_hash_table_new(g_int_hash, g_int_equal);
    for (int i = 0; i < 10; i++) {
        g_hash_table_insert(freq, GINT_TO_POINTER(i), GINT_TO_POINTER(0));
    }
    g_hash_table_destroy(freq);
}

我知道有两种方法可以使它正确:一种是创建一个像这样的哈希表而不改变其他任何东西:

   GHashTable * freq = g_hash_table_new(g_direct_hash, g_direct_equal);

第二种方法是,保持原样创建,但为键和值显式分配空间:

   int * key = malloc(sizeof(int));
   int * value = malloc(sizeof(int));

然后通过将其转换为 (gpointer) 来插入键和值。

第二种方法似乎是一种非常乏味的键值对方法,这是进行 int 到 int 映射的正确方法吗?谢谢。

【问题讨论】:

    标签: glib


    【解决方案1】:

    g_int_hash() 的文档说:

    请注意,此函数作用于指向gint 的指针,而不是直接作用于gint:如果您的哈希表的键是GINT_TO_POINTER (n) 的形式,请改用g_direct_hash()。

    所以是的,如果您正在执行 int-to-int 映射,您应该使用 g_direct_hash()、g_direct_equal() 和 GINT_TO_POINTER()。

    【讨论】:

    • 好的,这是有道理的,如果它仅适用于指向 int 的指针,那么使用 g_int_hash 函数的正确用例是什么...?
    • g_int_hash() 和 g_int_equal() 的唯一用例是如果您使用分配的指向整数的指针作为键,例如,如果您使用的是结构成员。跨度>
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2023-03-27
    • 2012-09-16
    • 2013-03-21
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多