簡體   English   中英

在64位系統上,如何傳入int作為void *

[英]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_createptr_to_int轉換回來的時候。

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

  1. 雖然可以保證任意指針在往返intptr_t和返回時仍然存在,但是甚至從intptr_t值創建指針也是未定義的行為,如不對應於有效指針,例如1.理論上,實現可能會扼流在無效指針上,或整數值可能無法在從intptr_t到指針和返回的往返中存活。

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

在實踐中極不可能遇到這兩種情況。 廣泛部署和便攜式軟件中的C代碼為此目的使用如上所述的演員表。

您可以將intvoid* ,但這不是可移植的。 例如,可以想象, sizeof(int)>sizeof(void*) ,盡管有些不太可能。 因此,如果您想要可移植,則應該將指針傳遞給int

例如,您可以使用mallocint分配存儲空間。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM