2012-05-18 81 views
2

我有一個函數getData(void* data) 應該複製到數據的一些內部計算值 例如int r = getRadius(); [R應該被複制到的數據,是從功能的getData 返回這樣什麼纔是正確之路去做吧? 我試過*(int*)data = r; 但我不確定這是否是最佳解決方案。複製到void *指針

+1

'*(int *)data = r;'如果事先知道'data'引用的內存的類型,那就完全沒問題。 – 2012-05-18 18:01:16

+0

爲什麼你首先使用'void *'指針? –

+0

這是我係統的一個API - 對此無關:) – Yakov

回答

7

如果您確定由空指針引用的內存是int,那麼您可以在

*(int *)data = r; 

有信心然而更好的通用的解決方案是:

memcpy(data, &r, sizeof(int)); 

這樣你不必擔心字節對齊或其他潛在問題。

+0

什麼樣的字節對齊gotcha與'*(int *)data = r;'有關(這是* not *與memcpy() ')? –

+1

@Alok,如果'data'開始於一個不能被sizeof(int)整除的內存位置(或者更確切地說是int數據的對齊),那麼這個代碼是未定義的。 'memcpy()'沒有任何對齊方式。 – Dave

+0

@Dave,'memcpy()'調用可能是明確定義的,但我想知道'data'沒有正確對齊'int'會有什麼用? –

0

我不認爲有一個很好的方法來做到這一點,你顯示的API。 dbeer的解決方案當然可行,但API本身是有問題的。

如果該函數返回一個半徑(整數),則輸出參數應爲int *
我想這不是那麼簡單。真正的功能更可能是類似於getData(int what, void *data),其中what的值確定數據的類型。
這樣的API並不好,因爲它會阻止編譯器(以及您在閱讀代碼時)正確檢查類型。

但是,如果您希望堅持使用此API,請至少添加一個大小參數,然後在寫入data之前進行驗證。