有一個process_create()
函數,它有一個參數爲void*
。 如果我想通過int
,我該怎麼做才能避免編譯器的編譯錯誤? 我不能帕拉姆列表改變爲process_create()
在64位系統上如何通過int作爲void *
回答
你可以只投了int
到void*
,但是這不便於攜帶。例如,儘管可能性不大,但可以想象的是,sizeof(int)>sizeof(void*)
。所以,如果你想要便攜,你應該傳遞一個指向int
的指針。
例如,您可以爲int
和malloc
分配存儲空間。
int *myparam = malloc(sizeof(*myparam));
*myparam = 42;
process_create(myparam);
不知道更多關於什麼是process_create
和做,我不能說誰應該負責的內存塊上調用free
。
這裏我的假設是process_create
是異步的,指針可能在process_create
調用返回後的某個時間被讀取。但是,如果在執行process_create
期間讀取指針,則可以使其更簡單。
int myparam = 42;
process_create(&myparam);
因此,底線是,我認爲最好還是通過一個int*
到process_create
。具體取決於process_create
的操作。
這很複雜。我可以做下面的轉換(void *)(uintptr_t)uintptr_t是一個平臺類型,它在64位系統上是uint64_t,在32位系統上是uint32_t – user1878701
您可以,但我不明白它是如何關聯的這個問題。這個問題談論'int'。 –
爲了安全起見,您可以將整數轉換爲intptr_t
,它的大小與指針保持一致,然後返回。
#include <inttypes.h>
inline void *int_to_ptr(int n) {
return (void *) (intptr_t) n;
}
inline int ptr_to_int(void *p) {
return (int) (intptr_t) p;
}
使用int_to_ptr
打電話時process_create
和ptr_to_int
轉換回來的時候。
這仍然是技術上不可移植的ISO C,因爲:
雖然可以保證任意指針會來回生存
intptr_t
和背部,它是不確定的行爲,甚至創建一個指針intptr_t
值類似於不對應於有效指針,例如1.理論上,實現可能會扼殺無效指針,或者整數值可能無法在從intptr_t
到指針並返回的往返中存活。理論上,某些C實現可能比指針寬
int
,在這種情況下,一些有效的整數值將溢出到intptr_t
。
這兩種情況在實踐中都不太可能遇到。在廣泛部署和便攜式軟件中的C代碼使用類似上面的代碼來實現此目的。
謝謝你的迴應。這在我需要支持調用這種類型的API所需的各種CPU上工作得非常好。我使用C++,但你的答案是完美的。 –
- 1. Windows 64位操作系統上的32位或64位Android SDK?
- 2. 64位系統上的GDI +
- 3. 64位系統上的NCover
- 4. 如何在64位操作系統上執行彙編程序?
- 5. C++ Long Long INT - 64位是否僅限於64位操作系統?
- 6. 如果操作系統是64位
- 7. 如何在64位系統上以32位模式編譯openSSL?
- 8. Libnids 64位系統
- 9. 32位/ 64位操作系統?
- 10. 無論系統是32位還是64位,int都是32位還是64位?
- 11. 安裝在64位操作系統上的Windows 32位Eclipse?
- 12. JNA在64位操作系統上具有32位JVM
- 13. 在64位操作系統上調試32位CASSINI(Oracle 9)
- 14. 在64位操作系統上啓動32位進程
- 15. 在64位架構上的32位操作系統
- 16. 在64位服務器上加載32位dll操作系統
- 17. 在32位操作系統上運行64位jvm
- 18. 在64位系統上將Asp.NET編譯爲32位
- 19. 如何在32位操作系統上使用VBScript顯示64位雙數?
- 20. 淨WinForm的系統提示音在64位操作系統
- 21. 64位操作系統上的32位或64位應用程序?
- 22. 在32位操作系統上運行二進制文件以在64位操作系統上運行
- 23. 在64位操作系統上編寫程序時,程序是否會運行在32位操作系統上?
- 24. 如何檢測Flex中的32位或64位操作系統?
- 25. 如何從32位應用程序註冊64位DLL(在64位操作系統上)
- 26. 如何在64位操作系統中註冊activeX組件(.dll)
- 27. 64位操作系統的Microsoft.Win32.RegistryKey
- 28. Lotus Notes Interop.Domino.dll 64位操作系統
- 29. 64位操作系統內存分配
- 30. 如何讓xp_pcre在64位系統上運行?
你使用哪些平臺?什麼編譯器(編譯器)? –
您可以使用該指針將*指針*傳遞給整數。當然,這會引入有關地址空間的問題,並知道子進程何時結束了該內存,但是必須有某種方法來處理該問題,或者爲什麼該函數接受指針參數? – Steve314