将项目添加到数据结构(C)

时间:2018-10-19 14:46:15

标签: c pointers hashset

我正在使用库C-Collections,并且在使用HashSet时遇到了一些麻烦。假设我想像这样将循环中的数字添加到集合中:

for (int j = 0; j < M; ++j) {
        if (Matrix[j][i] == 1) {
            int* key_I_want_to_add = &j;
            if(hashset_add(the_set, key_I_want_to_ad) != CC_OK)
                printf("error");
            else {
                printf("added tool %d to job %d -- ", tool, i);
                printf("size is now %d ", hashset_size(tools));
            }
        }
    }

这会将密钥的地址添加到集合中。问题在于,在每个循环中,都将密钥分配给相同的地址,并覆盖第一个密钥。集合的大小保持为1。add函数的原型为

enum cc_stat hashset_add(HashSet *set, void *element);

我应该如何进行。我目前正在学习C,这可能有点琐碎...

谢谢

2 个答案:

答案 0 :(得分:2)

该哈希集实现似乎希望添加指向该项目的指针。列表中只包含1个元素的原因是,您不断向其传递相同的地址,即j的地址。此外,一旦离开外部for循环j就会超出范围,因此保存的指针将不再有效。

您需要为要添加的每个元素动态分配内存:

        int *key_I_want_to_add = malloc(sizeof(int));
        *key_I_want_to_add = j;
        if(hashset_add(the_set, key_I_want_to_ad) != CC_OK)
            printf("error");

使用哈希集完成操作后,请不要忘记清理此内存。

答案 1 :(得分:0)

您每次只是将指针添加到局部变量j。您的库可能只是存储指针(因此,在这种情况下,它每次都向j存储相同的指针。您可以动态分配新的int(这可能更正确,但似乎很浪费)就内存和周期而言)或仅将值强制转换为void *指针:

hashset_add(the_set, (void *)j);

现在,那是您真正想要的吗?我不确定您是否真的打算存储整数0 ... M-1,因为这就是该代码的作用。