[英]on 64bit system, how to pass in int as void *
有一個process_create()
函數,它的參數為void*
。 如果我想傳入一個int
,我怎么能這樣做以避免編譯器的構建錯誤? 我無法將參數列表更改為process_create()
為了安全起見,您可以將整數轉換為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代碼為此目的使用如上所述的演員表。
您可以將int
為void*
,但這不是可移植的。 例如,可以想象, sizeof(int)>sizeof(void*)
,盡管有些不太可能。 因此,如果您想要可移植,則應該將指針傳遞給int
。
例如,您可以使用malloc
為int
分配存儲空間。
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
的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.