簡體   English   中英

如何將 int 轉換為 void *?

[英]how to convert int to void *?

我正在嘗試使用說明符%p制作sscanf的模擬。

我用這個:

int res = ahex2num(buf);
*va_arg(ap, void **) = (void *) res;

它工作正常,我實際上得到了我傳遞的地址,比如0x1A但我遇到了這個錯誤:

warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]

在主 function 中:

int main(){
    void *a;
    readFromStr("0x1A", "%p", &a);
    printf("%p", a); 
    return 0;
}

/*
out: 0x1a
*/

我能以某種方式避免這種情況嗎?

long ahex2num(unsigned char *in){
    unsigned char *pin = in;
    long out = 0;
    while(*pin != 0){
        out <<= 4;
        out +=  (*pin < 'A') ? *pin & 0xF : (*pin & 0x7) + 9;
        pin++;
    }
    return out;
}

顯然,指針,尤其是void * ,與系統上的int具有不同的大小。 例如,指針可能是 64 位,而int可能是 32 位。 在像sscanf這樣的例程中實現%p是將 integer 轉換為void *的正當理由,但您需要使用 integer 類型來保存指針所需的所有位。 一個好的類型可能是uintptr_t ,在<stdint.h>中聲明。

您將需要確保與掃描中的整數一起使用的所有代碼(例如ahex2num )都可以支持必要的寬度和符號,包括根據需要處理潛在的溢出。

如果我有你的完整代碼,我可以測試它。 我假設在不使用 pragma 的情況下刪除警告就像將類型轉換從 int 更改為 long int 一樣簡單。

我這樣解決了這個問題:

long long int res = ahex2num(buf);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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