我正试图弄清楚是否可以获取内存中整数的整数地址,并将其强制转换回实际指针。下面是一个例子。我的最终目标,也许是我把问题弄得过于复杂了,是我在内存中有一个指向很大对象的指针。我需要将指针/数据共享给其他线程,并且我现有的唯一机制(遗留系统(是与uint8_t[8]数组通信。所以我要取指针地址,将其转换为int,将其拆分为字节数组,进行传输,然后在另一端重新组装。
#include <stdint.h>
int main() {
/* Test value to see if code works */
uint64_t value = 123;
/* Get the pointer to the value, this is what we will working with */
uint64_t* value_ptr = &value;
/* Get the integer value of the address/memory location, this is what I am
try to cast back into a pointer to 'value' */
uint64_t value_adr_int = &value_ptr;
/* Some time later we want to get back to value_ptr.
This is the piece not working */
uint64_t* cast_value_ptr = (uint64_t*)value_adr_int;
/* Test to make sure our newly casted pointer points to the original int */
if (*cast_value_ptr == value) {
/* Print success */
}
}
编辑:感谢Daniel将一行改为:
uintptr_t value_adr_int = (uintptr_t)value_ptr;
您正在将value_adr_int
设置为&value_ptr
。这意味着value_adr_int
持有uint64_t**
的值,而不是您想要的uint64_t*
的值。您需要移除&
。
另一方面,您应该使用uintptr_t
,它是在C99中添加的(我相信(。它是为这种确切情况而设计的整数类型。将指针投射到uintptr_t
并返回是完全安全的。