2016-04-06 162 views
0

我试图将int变量添加到此fifo。 fifo.c将元素添加到fifo队列

但我只看到同样的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); 

是工作罚款,但我有警告 - “投给指针从不同大小的整数”

我做错了什么?最好的祝福。

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

TY为@JonathanLeffler其他评论员

+2

这两个不相等。 'fifo_add(ff,(void *)x);'添加一个int值。 'fifo_add(ff,k);'添加一个指向int值的指针。那么你真的试图存储一个int或一个int指针吗? – kaylum

+2

你在做错的一件事是在循环中调用'free()'。看看'fifo.c'中的代码;它将指针复制到结构中(它不能复制数据,因为它没有告诉数据有多大)。所以,你一直通过分配内存来滥用内存,将指针复制到FIFO中,然后释放它。每次分配时你可能会得到相同的内存,所以每个新的条目都会践踏前一条。将'free()'移动到一个单独的循环 - 或者一个新的回调函数。 –

+0

我试图存储指针。我知道他们不相同:) – Max

回答

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指向一个共同的记忆。