2012-12-05 42 views
3

有一個process_create()函數,它有一個參數爲void*。 如果我想通過int,我該怎麼做才能避免編譯器的編譯錯誤? 我不能帕拉姆列表改變爲process_create()在64位系統上如何通過int作爲void *

+0

你使用哪些平臺?什麼編譯器(編譯器)? –

+3

您可以使用該指針將*指針*傳遞給整數。當然,這會引入有關地址空間的問題,並知道子進程何時結束了該內存,但是必須有某種方法來處理該問題,或者爲什麼該函數接受指針參數? – Steve314

回答

1

你可以只投了intvoid*,但是這不便於攜帶。例如,儘管可能性不大,但可以想象的是,sizeof(int)>sizeof(void*)。所以,如果你想要便攜,你應該傳遞一個指向int的指針。

例如,您可以爲intmalloc分配存儲空間。

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的操作。

+0

這很複雜。我可以做下面的轉換(void *)(uintptr_t)uintptr_t是一個平臺類型,它在64位系統上是uint64_t,在32位系統上是uint32_t – user1878701

+0

您可以,但我不明白它是如何關聯的這個問題。這個問題談論'int'。 –

4

爲了安全起見,您可以將整數轉換爲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_createptr_to_int轉換回來的時候。

這仍然是技術上不可移植的ISO C,因爲:

  1. 雖然可以保證任意指針會來回生存intptr_t和背部,它是不確定的行爲,甚至創建一個指針intptr_t值類似於不對應於有效指針,例如1.理論上,實現可能會扼殺無效指針,或者整數值可能無法在從intptr_t到指針並返回的往返中存活。

  2. 理論上,某些C實現可能比指針寬int,在這種情況下,一些有效的整數值將溢出到intptr_t

這兩種情況在實踐中都不太可能遇到。在廣泛部署和便攜式軟件中的C代碼使用類似上面的代碼來實現此目的。

+1

謝謝你的迴應。這在我需要支持調用這種類型的API所需的各種CPU上工作得非常好。我使用C++,但你的答案是完美的。 –

相關問題