[英]Convert char* to int memory address
我有:
char* mem = (char*) 0xB8000;
然后將mem
傳遞給 function。 在 function 內部,我想取回數字0xB8000
並將其與其他一些整數進行比較。 如何將mem
轉換回原來的 integer?
要將任何指針轉換為 integer,請執行以下操作:
#include <stdint.h>
uintptr_t ptr_to_integer(const void *ptr) {
return (uintptr_t) ptr;
}
請注意, uintptr_t
的大小可能因平台而異。 這也是 C 標准的可選部分,因此從技術上講,只有uintmax_t
絕對是可移植的。
如何將 mem 轉換回原來的 integer?
通常轉換為(u)intptr_t
將形成原始的 integer。
include <stdint.h>
printf("o: %lX\n", 0xB8000LU);
char* mem = (char*) 0xB8000;
printf("mem %p\n", (void *) mem);
uintptr_t i = (uintptr_t) mem;
printf("i: %jX\n", (uintmax_t) i);
陷阱
C 未指定往返(u)intptr_t
到void *
到uintptr_t
(或任何 integer 類型)以產生原始值。 甚至void *
to (u)intptr_t
to void *
也只是指定返回一個等價的指針,不一定是相同的指針位模式。
未指定將任意數字(如(char*) 0xB8000
為指針工作。
“結果是實現定義的,可能沒有正確對齊,可能不指向引用類型的實體,並且可能是陷阱表示”C17dr 6.3.2.3 5
(u)intptr_t
是可選類型——雖然很常見。 兼容的庫可能無法提供該類型。
(u)intptr_t
沒有對應的打印說明符。 一個合理的解決方法是轉換為最廣泛的可用類型和打印。
我想取回數字 0xB8000 並將其與其他一些整數進行比較。
更好的方法可以將“其他整數”轉換為char *
並比較指針。
最適合 OP 發布更大的代碼使用情況來處理總體目標。
謹慎行事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.