我有一個函數getData(void* data)
應該複製到數據的一些內部計算值 例如int r = getRadius();
[R應該被複制到的數據,是從功能的getData 返回這樣什麼纔是正確之路去做吧? 我試過*(int*)data = r;
但我不確定這是否是最佳解決方案。複製到void *指針
回答
如果您確定由空指針引用的內存是int,那麼您可以在
*(int *)data = r;
有信心然而更好的通用的解決方案是:
memcpy(data, &r, sizeof(int));
這樣你不必擔心字節對齊或其他潛在問題。
什麼樣的字節對齊gotcha與'*(int *)data = r;'有關(這是* not *與memcpy() ')? –
@Alok,如果'data'開始於一個不能被sizeof(int)整除的內存位置(或者更確切地說是int數據的對齊),那麼這個代碼是未定義的。 'memcpy()'沒有任何對齊方式。 – Dave
@Dave,'memcpy()'調用可能是明確定義的,但我想知道'data'沒有正確對齊'int'會有什麼用? –
我不認爲有一個很好的方法來做到這一點,你顯示的API。 dbeer的解決方案當然可行,但API本身是有問題的。
如果該函數返回一個半徑(整數),則輸出參數應爲int *
。
我想這不是那麼簡單。真正的功能更可能是類似於getData(int what, void *data)
,其中what
的值確定數據的類型。
這樣的API並不好,因爲它會阻止編譯器(以及您在閱讀代碼時)正確檢查類型。
但是,如果您希望堅持使用此API,請至少添加一個大小參數,然後在寫入data
之前進行驗證。
- 1. 將std :: vector複製到void指針
- 2. 使用memcpy從字符串複製到void指針的問題
- 3. C++ void指針
- 4. C#void指針?
- 5. void指針
- 6. 類的指針void *
- 7. void *指針上的指針運算
- 8. 使用malloc和void指針複製臨時結構
- 9. 如何從C++中的void指針複製數據?
- 10. 複製指針值
- 11. C++複製指針
- 12. strcpy()複製指針?
- 13. 複製和指針
- 14. 將指針指向的數據複製到另一個指針
- 15. 複製字符串指針,指針
- 16. 複製的結構指針的指針
- 17. void指針到升壓的矢量共享指針
- 18. C++ void指針得到結構體
- 19. 鑄造結構指針到void
- 20. void表達式的無效使用;從void指針指向的數組複製信息;到char指針所指向的數組中
- 21. int指針變爲void指針,然後變成雙指針
- 22. 如何將void(__thiscall MyClass :: *)(void *)轉換爲void(__cdecl *)(void *)指針
- 23. 右鍵投給void *指針
- 24. 追加兩個void *指針
- 25. 特殊指針值((void *)1)
- 26. void *與char *指針算術
- 27. cpp make_shared for void指針
- 28. void函數中的指針
- 29. 寫入void指針到二進制文件
- 30. 將一個指針複製到C++中的其他指針
'*(int *)data = r;'如果事先知道'data'引用的內存的類型,那就完全沒問題。 – 2012-05-18 18:01:16
爲什麼你首先使用'void *'指針? –
這是我係統的一個API - 對此無關:) – Yakov