我试图将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和其他评论员答案 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指向公共内存。