2011-07-04 56 views
6

我正在編寫一個解釋器,我希望能夠將函數返回的任何值存儲到一個空指針中。我沒有問題存儲整數和各種指針作爲無效指針,但當我試圖將一個雙精度指針作爲void指針時出現錯誤。我知道雙精度數據的存儲方式與位級的整數和指針不同,但我不明白爲什麼我不能在指針中放置任何我想要的位(假設它已經分配了足夠的內存),然後再取出它們,將它們鑄成雙層。在C中將double轉換爲void *

是否有可能使用語法將一個double轉換爲void指針我不知道或者我誤解了void指針的工作原理?

+4

有你使用'union',而不是考慮? –

+4

這聽起來像你正在做一些可怕的錯誤。請看David的回答。 – pmr

+0

檢查我在這個問題的答案http://stackoverflow.com/questions/6539023/storing-values-in-union-in-c/6539185#6539185 –

回答

12

在許多系統上,一個double是8個字節寬,一個指針是4個字節寬。因此,前者不適合後者。

您似乎在濫用void*。您的解決方案將涉及分配至少與您需要以某種類似變體結構存儲的最大類型一樣大的存儲空間,例如,一個union

+2

我不能相信我從來沒有聽說過工會之前。這正是我所期待的。 – Jack

+1

+1表示正確的方法。 :) –

2

當然可以施放它。無效指針是使C中的多態性成爲可能的原因。您需要事先知道您傳遞給函數的內容。

void *p_v ; 
double *p_d ; 
p_d = malloc(sizeof(double)) ; 
p_v = (void *) p_d ; 
+0

你的例子似乎工作,因爲'p_d'是一個指針。操作系統詢問一個非指針void *轉換。 – 2016-03-03 20:06:31

0

這裏是它

int main () { 
    double d = 1.00e+00 ; // 0x3ff0000000000000 
    double * pd = & d ; 
    void * * p = (void * *) pd ; 
    void * dp = * p ; 
    printf ("%f %p %p %p \n" , d , pd , p , dp) ; 
    return 0 ; 
} ; 

輸出

1.000000 0x7fff89a7de80 0x7fff89a7de80 0x3ff0000000000000 

第二和第三地址可能會有所不同。快捷方式

void * dp = * (void * *) & d ; 

乾杯

+0

這是未定義的行爲(嚴格別名違規) –

+0

@ M.M它不是。我投了指針,我知道我在做什麼,它不是C++,它編譯並提供正確的輸出。我不會建議在長碼中使用這種技術,但我是對的。 – Fabio

+0

表達式'* p'具有'void *'類型,但是正在訪問實際上是'double *'類型的內存。這些甚至可能是不同的大小 –

相關問題