2014-04-02 89 views
0

我有一種情況,在void指針內部的地址中被複制到另一個指針。如果不進行類型轉換,則不會發出警告或錯誤。僞代碼看起來像將void指針的值賦給非空指針

structA A; 
void * p = &A; 
structA * B = p;// Would like to conform this step 

我沒有預見到任何問題。 但是由於這個操作使用了很多地方,我想確認它是否可以有任何複製。還有什麼編譯器依賴?

+1

請參閱http://stackoverflow.com/questions/15745030/type-punning-with-void-without-breaking-the-strict-aliasing-rule-in-c99 –

+0

「是否符合複製條件」?爲什麼不使用簡單的英語:「我想檢查它是否有效。」 –

+0

我已經測試了一些僞代碼,它工作正常。仍然問題是爲了符合沒有任何隱藏問題的可能性.....對不起,如果這造成了混亂 –

回答

4

不,這很好,100%的標準。

A void *可以毫無問題地轉換成任何其他數據/對象指針並從中轉換。

注意,數據/對象限制:函數指針轉換到/自void *

這就是爲什麼you shouldn't cast the return value of malloc(),它返回void *

1

在C a void *隱式兼容任何指針。這就是爲什麼你不需要投擲,例如將任意類型的指針傳遞給參數爲void *的函數,或者在返回函數返回void *(這裏是malloc就是一個很好的例子)的指針(仍然是任何類型)時分配指針。

+0

任何* object *指針,我會說。 –