将元素添加到fifo队列

时间:2016-04-06 05:10:12

标签: c memory-management

我试图将int变量添加到此fifo中。 fifo.c

但我只看到相同的var(这是最后一个var)

fifo_t *ff = fifo_new();


for (int i =0; i<4; i++) {
    int *k = malloc(sizeof(int));
    *k = rand();
    printf("%d %p!\n", *k, k);
    fifo_add(ff, k);
    free(k);
}

fifo_iter(ff, my_callback, NULL);

如果我在堆栈中创建int var并像这样添加到fifo

    int x =0;
fifo_add(ff, (void *)x);
x = 2;
fifo_add(ff, (void *)x);
x = 3;
fifo_add(ff, (void *)x);

工作正常,但我有警告 - &#34;从不同大小的整数转换为指针&#34;

我做错了什么?最好的问候。

修改: 我发现fifo.c中的函数用于销毁fifo队列的所有元素。对于我的例子,你需要调用fifo_free(of,NULL);如果要将自定义结构添加到队列中,则需要编写一些函数来销毁结构并将其放在fifo_free的第二个参数中。

@JonathanLeffler和其他评论员

1 个答案:

答案 0 :(得分:0)

使用

fifo_add(ff, &x);

您需要将指针传递给data,而不是指定的标量类型,因为fn_data被声明为void *,并且void *无法保证保持所有标量类型。因此,无法int个变量添加到fifo。

另请注意

int x =0;
fifo_add(ff, &x);
x = 2;
fifo_add(ff, &x);
x = 3;
fifo_add(ff, &x);

可能无法按预期工作。它是存储在新节点中的x的地址,而不是它包含的值。因此,您最终将获得3个新节点,其fn_data s指向公共内存。