2013-03-26 54 views
0

這可能是一個簡單的問題,但我似乎無法得到它的權利(甚至沒有足夠的使然)。考慮下面的例子:對象爲void *

Datum getDatum(...); 
List* lappend(List *list, void *datum); 

void my_fun(List **args){ 
    lappend(*args, getDatum(...)); 
} 

不幸的是,編譯器產生因爲內my_funlappend呼叫爲參數2的指針不匹配的錯誤。我試圖把*,如*(getDatum(...))&,但都沒有幫助。

什麼是錯的代碼?

回答

1

你不能這樣做,作爲getDatum返回類型爲Datum

你可以做的是,

void my_fun(List **args){ 
    Datum data = getDatum(); 
    lappend(*args, (void *)&data); 
} 
+0

好的!所以基本上不可能把它放在一行中,對嗎? – navige 2013-03-26 08:52:29

+0

你可以,但它很可能會在運行時崩潰 – stijn 2013-03-26 08:53:43

+1

但是,該代碼或多或少是無用的,因爲它會附加一個局部變量的地址。數據一旦超出範圍,即該功能結束,該地址就會失效。 – unwind 2013-03-26 08:57:21

2

無法從像Datum的值轉換爲指針像void*,或Datum*。而你絕對不能dereferenec值類型(你試過*(getDatum(...)))如果更改getDatum到

Datum* getDatum(...);

應該編譯,但我建議你上指針等讀了也知道,如果你分配基準在某處使用malloc()時,應該有相應的free()調用,如果將所有內容放在void *列表中,這會變得很難。

相關問題