C GLib哈希表未返回正确的值

C GLib哈希表未返回正确的值,c,struct,malloc,glib,C,Struct,Malloc,Glib,我在内存结构下的GLib哈希表中添加了几个键和值对。键是从malloc返回的(char*)指针。该值是分配给malloc的大小 void addstomemstruct(struct memory *mem, char *key_address, size_t sz) { g_hash_table_insert(mem->singleton, key_address, &sz); printf("** retrieving size: %Zu add=%p\n",(

我在内存结构下的GLib哈希表中添加了几个键和值对。键是从malloc返回的(char*)指针。该值是分配给malloc的大小

void addstomemstruct(struct memory *mem, char *key_address, size_t sz) {
    g_hash_table_insert(mem->singleton, key_address, &sz);
    printf("** retrieving size: %Zu add=%p\n",(*(size_t*) g_hash_table_lookup(mem->singleton, key_address)), key_address);
}
后来,当我根据基于键的值检索值时,返回的大小(值)总是10,这是我添加到哈希表中的最后一个值

size_t get_blocksize(GHashTable *hashtable, char *key_address, size_t *result_flag)
{   size_t *sz_ptr = (size_t *) g_hash_table_lookup(hashtable, key_address);
    ...

char *logmsg;asprintf(&logmsg,"In get_blocksize: *sz_ptr=%Zu\n",*sz_ptr);
    log_msg(logmsg);

printf("** retrieving size: %Zu add=%p\n",(*(size_t*) g_hash_table_lookup(hashtable, key_address)), key_address);
...
}
打印输出:

preparing to add pointer: 0x9b52f10
** adding size: 1
** retrieving size: 1 add=0x9b52f10
preparing to add pointer: 0x9b52f48
** adding size: 2
** retrieving size: 2 add=0x9b52f48
preparing to add pointer: 0x9b52f58
** adding size: 3
...
preparing to add pointer: 0x9b52fc8
** adding size: 10
** retrieving size: 10 add=0x9b52fc8
然后,稍后当我尝试检索第一个值时:

In get_blocksize: *sz_ptr=10
** retrieving size: 10 add=0x9b52f10
Freed address 0x9b52f10.  Size: 10. mem->stats->active_count=9, mem->stats->active_size=45.

您正在将指向自动存储持续时间变量(函数参数)的指针作为哈希表值传递。当它超出范围时,访问它是一种未定义的行为

您可以:

  • 使用
    malloc
    /
    gnew
    sz
    分配存储,并在创建哈希表时注册适当的
    值\u destroy\u func
  • 利用
    size\u t
    值适合指针的事实,将其转换为
    gpointer
    。从技术上讲,这是一个UB,但应该适用于大多数平台。除非将小对象分配确定为瓶颈,否则可能不应该这样做

您正在将指向自动存储持续时间变量(函数参数)的指针作为哈希表值传递。当它超出范围时,访问它是一种未定义的行为

您可以:

  • 使用
    malloc
    /
    gnew
    sz
    分配存储,并在创建哈希表时注册适当的
    值\u destroy\u func
  • 利用
    size\u t
    值适合指针的事实,将其转换为
    gpointer
    。从技术上讲,这是一个UB,但应该适用于大多数平台。除非将小对象分配确定为瓶颈,否则可能不应该这样做

谢谢。你说的UB是什么意思?第二个选项是否允许我不必分配空间?哈希表不在调用get_blocksize.UB=未定义行为的函数范围内。是的,您在存储时将值强制转换为指针,在检索时将值强制转换为指针。只是不要将其用作指针(GLib不会在内部使用)。您可以使用宏
GSIZE\u TO\u pointer
GPOINTER\u TO\u SIZE
,它们以独立于平台的方式完成转换。谢谢。你说的UB是什么意思?第二个选项是否允许我不必分配空间?哈希表不在调用get_blocksize.UB=未定义行为的函数范围内。是的,您在存储时将值强制转换为指针,在检索时将值强制转换为指针。只是不要将其用作指针(GLib不会在内部使用)。您可以使用宏
GSIZE\u TO\u pointer
GPOINTER\u TO\u SIZE
,它们以独立于平台的方式完成转换。