我有一種情況,在void指針內部的地址中被複制到另一個指針。如果不進行類型轉換,則不會發出警告或錯誤。僞代碼看起來像將void指針的值賦給非空指針
structA A;
void * p = &A;
structA * B = p;// Would like to conform this step
我沒有預見到任何問題。 但是由於這個操作使用了很多地方,我想確認它是否可以有任何複製。還有什麼編譯器依賴?
我有一種情況,在void指針內部的地址中被複制到另一個指針。如果不進行類型轉換,則不會發出警告或錯誤。僞代碼看起來像將void指針的值賦給非空指針
structA A;
void * p = &A;
structA * B = p;// Would like to conform this step
我沒有預見到任何問題。 但是由於這個操作使用了很多地方,我想確認它是否可以有任何複製。還有什麼編譯器依賴?
不,這很好,100%的標準。
A void *
可以毫無問題地轉換成任何其他數據/對象指針並從中轉換。
注意,數據/對象限制:函數指針不轉換到/自void *
。
這就是爲什麼you shouldn't cast the return value of malloc()
,它返回void *
。
在C a void *
隱式兼容任何指針。這就是爲什麼你不需要投擲,例如將任意類型的指針傳遞給參數爲void *
的函數,或者在返回函數返回void *
(這裏是malloc
就是一個很好的例子)的指針(仍然是任何類型)時分配指針。
任何* object *指針,我會說。 –
請參閱http://stackoverflow.com/questions/15745030/type-punning-with-void-without-breaking-the-strict-aliasing-rule-in-c99 –
「是否符合複製條件」?爲什麼不使用簡單的英語:「我想檢查它是否有效。」 –
我已經測試了一些僞代碼,它工作正常。仍然問題是爲了符合沒有任何隱藏問題的可能性.....對不起,如果這造成了混亂 –