C - g_hash_table_insert malloc():内存损坏



我会尝试在Glib散列中存储许多列表(数组)。下面是示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <glib.h>
#define NR 10
typedef unsigned char carr[NR];
GHashTable* hasht;
int init = 0;

int main() {
    carr *c, *d;
    int i;
    hasht = g_hash_table_new(g_str_hash, g_str_equal);
    c = g_malloc0(sizeof *c);
    for(i=0; i<NR; i++) {
    *c[i] = 70+i;
    }
    for(i=0; i<NR; i++) {
    printf("%dn", *c[i]);
    }
    g_hash_table_insert(hasht, "1", c);
    printf("----------------n");
    d = g_hash_table_lookup(hasht, "1");
    for(i=0; i<NR; i++) {
    printf("%dn", *d[i]);
    }
    return 0;
}

你可以这样编译这些代码:

gcc -Wall -o arrtest arrtest.c `pkg-config --cflags --libs glib-2.0`

如果我运行编译后的代码,我得到了这个错误:

*** Error in `./arrtest': malloc(): memory corruption: 0x00000000018efe70 ***

但是如果我改变上面两行的顺序:

hasht = g_hash_table_new(g_str_hash, g_str_equal);
c = g_malloc0(sizeof *c);

:

c = g_malloc0(sizeof *c);
hasht = g_hash_table_new(g_str_hash, g_str_equal);

代码运行没有任何问题。

为什么?

项目将像这样存储许多列表:

a = {0, 1, 3, 4, 2, 0, 5, 9, 20};

和每个列表都有一个字符串键。函数应该是这样的:

store_in_hash(char * key, int idx)

从另一个地方调用。该函数检查全局哈希表是否存在,如果不存在,则创建它。然后查找键,如果不存在,创建一个新的键,并增加list的第idx项。在哈希表中存储多个列表的预期方式是什么?

谢谢你的帮助:

airween

这里的问题是操作符优先级:

*c[i] = 70+i;

数组索引发生在指针解引用之前。所以你想要的是(*c)[i]。顺便说一句,我会避免这种令人困惑的代码风格;你的typedef是不必要的,只要使用char指针,你就不会陷入这种奇怪的情况。

相关内容

  • 没有找到相关文章

最新更新