我有一个内存缓冲区,我想将其地址存储在一个无符号整数值中。
uint8_t* _buff = new uint8_t[1024];
uint64_t* _base_addr = (uint64_t *)_buff;
我希望将 _buff 或 _base_addr 指向的位置的地址(无论如何它是相同的位置)存储在 uint32_t 值中。
这样当我读取整数的值时,它就会给我地址。如何才能做到这一点 ?
您不能将地址存储在“say”uint32_t
变量中,因为地址可能不适合 - 在 64 位系统上,指针需要 64 位存储空间。uintptr_t
使用C99 ( <stdint.h>
) 或 C++11 ( )代替固定大小<cstdint>
。
要将地址存储在这样的整数变量中,请使用
uintptr_t variable = (uintptr_t)pointer;
只需投射它:uint32_t addr = (uint32_t)_buff;
但是,您应该有一个很好的理由这样做,原因有两个:
它不是可移植的,甚至可能是错误的——不同系统之间的地址大小不同,通常(但不限于)它将是 32 位或 64 位。
它会损害代码的可读性。正是因为这个原因而存在指针 - 存储(和操作)地址。
当您需要操作映射到内存的硬件设备时,您可能希望将地址存储为整数。在这种情况下,您需要非常清楚自己在做什么。