【发布时间】:2020-08-16 15:38:11
【问题描述】:
我有一个 8 字节长的 void * 变量,就像所有指针一样。我正在使用 8 字节格式的地址,因为它们存储在指针中,但足够小,只能用 4 个字节表示。我想让void * 变量的前 4 个字节为一个地址,而后 4 个字节为另一个地址;
所以如果我有void *p = 0x0000000000000000 并且我有其他指针 void *a = 0x12345678 和void *b = 0x12345678 我想以void *p = 0x1234567812345678 结束
我正在尝试使用以下功能:
void set_ptr(void *p, void *first_ptr, void *second_ptr){
*(unsigned int *)(p) = (unsigned int)(first_ptr);
*(unsigned int *)((char*)p + 4) = (unsigned int)(second_ptr);
}
这会起作用还是有更好的方法来做到这一点?
【问题讨论】:
-
p = (void*)(((uint64_t)a << 32) | (uint32_t)b)。但这是非常脆弱的,并且可能具有未定义的行为。 -
而不是
void*使用uint64_t: ...uint64_t final = ((uint64_t)((uint32_t)0x12345678) << 32) + (uint32_t)0x12345678; /* thanks @EricPostpischil*/记得#include