我有一个函数foo(void * pBuf)。我需要传递一个64位的地址,但是当我通过值传递时,我似乎无法获得正确的类型转换。
示例:foo(地址)。其中 - uint64_t address = 0x00000000DEADBEEF
编辑:使用ARM编译器进行编译。
uint64_t foo(void *pBuf){
uint64_t retAddr = (uint64_t) pBuf;
retAddr += 0x100000;
return retAddr;
}
我使用的是32位ARM而sizeof(void *)
是4
澄清:为什么我需要在32位ARM上使用64位地址? 因为我的内存映射使用36位寻址。
答案 0 :(得分:1)
这样称呼:
uint64_t address = 0xDEADBEEF;
foo((void*)address);
也就是说,你将地址转换为void指针以与函数签名兼容。
答案 1 :(得分:0)
不应将64位类型用于地址,因为对于32位(或任何非64位)系统,它是未定义的行为。
相反,更喜欢使用uintptr_t
,这是标准C.
有关详细信息,请参阅this question;有关参考信息,请参见this page。
然后解决方案可能是:
uintptr_t address = 0xDEADBEEF; /* will trigger a warning if the constant is > max possible memory size */
foo((void*)address);
注意:如果您的系统上没有uintptr_t
,size_t
通常是第二选择。
在你的改述问题中,您希望将地址转换为64位整数。
在这种情况下,由于宽度的潜在差异,从ptr到整数的直接转换可能会触发编译器警告。
喜欢双重演员:
uint64_t value = (uint64_t)(size_t) ptr;
答案 2 :(得分:0)
我可以想出两种方法来做到这一点。通过第一种方式调用foo来解决我的问题
这只是因为我对foo的输入始终是32位值。返回的值可以是64位。
感谢所有的建议!