2016-04-06 160 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指向一個共同的記憶。