当前位置:  开发笔记 > 程序员 > 正文

GLib哈希表循环问题

如何解决《GLib哈希表循环问题》经验,为你挑选了1个好方法。

我将在C程序中使用GLib的Hash表实现,现在我只是在尝试它.我编写了以下代码用于测试:

 #include 
 #include 
 #include 
 #include 
 #include 

 int main(){
 // Some codes and declerations here
 GHashTable *g_hash_table;
 uint32_t *a;
 a=(uint32_t *)malloc(sizeof(uint32_t));
 if(a==NULL){
    printf("Not Enough Mem For a\n");
    return 1;
 }
 *a=1123231;

 uint32_t* key;
 key=(uint32_t *)malloc(sizeof(uint32_t));
 if(key==NULL){
     printf("Not Enough Mem For key\n");
     return 1;
 }
 *key=122312312;
 int i;
 g_hash_table=g_hash_table_new(g_int_hash, g_int_equal);
 for(i=0;i

不知何故,我的测试代码正确迭代,但在循环中它总是返回最后一个键和最后一个值对,它总是相同的.这里有什么问题?上面的代码可能无法以格式运行.我只是复制并粘贴了一些部分,以便清楚地了解我要做的事情.



1> unwind..:

我认为您的插入代码已损坏.您只需分配一次内存,然后执行多次插入,增加存储在每个内存之间的单个分配位置的值.

哈希表存储您的指针,因此它最终会将每个键与相同的指针相关联.

此外,您应该使用g_malloc()glib,以保持一致性.

而且我总是建议使用sizeof对象而不是它们的类型; 这样你就不会以一种危险的方式重复自己.所以,而不是

  guint32 *a;

  a = g_malloc(sizeof (guint32));

使用

  a = g_malloc(sizeof *a);

通过这种方式,您可以"锁定"依赖关系,这样您就可以随时分配足够的空间来存储任何a点,即使您稍后更改了类型.

此外,你应该仔细看看你做的每一个演员.将任何非常量指针强制转换gpointer为犹豫不决的程序员的标志.使用glib,gpointer它只是一个同义词void *,因此永远不需要强制转换.它只会增加你的代码,使其更难阅读.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有