我会尝试在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指针,你就不会陷入这种奇怪的情况。