我正在嘗試sscanf使用說明符來模擬%p。
我用這個:
int res = ahex2num(buf);
*va_arg(ap, void **) = (void *) res;
它作業正常,我實際上得到了我通過的地址,0x1A但我面臨這個錯誤:
warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
在主要功能中:
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;
}
uj5u.com熱心網友回復:
顯然,指標,特別是void *,與您的系統具有不同的大小int。例如,指標可以是64位,int也可以是32位。%p在例程中實作likesscanf是將整數轉換為 的正當理由void *,但您需要使用可以保存指標所需的所有位的整數型別。一個好的型別可能是uintptr_t在<stdint.h>.
您需要確保所有與掃描中的整數一起使用的代碼,例如ahex2num,都可以支持必要的寬度和符號,包括根據需要處理潛在的溢位。
uj5u.com熱心網友回復:
如果我有你的全部代碼,我可以測驗它。我假設在不使用編譯指示的情況下洗掉警告就像將型別轉換從 int 更改為 long int 一樣簡單。
uj5u.com熱心網友回復:
我這樣解決了這個問題:
long long int res = ahex2num(buf);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/473137.html
下一篇:有沒有辦法動態使用fgets大小
