uint64_t类型的参数与void *类型的参数不兼容

时间:2015-12-18 02:38:37

标签: c arm

我有一个函数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位寻址。

3 个答案:

答案 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_tsize_t通常是第二选择。

第2部分 :

在你的改述问题中,您希望将地址转换为64位整数。

在这种情况下,由于宽度的潜在差异,从ptr到整数的直接转换可能会触发编译器警告。

喜欢双重演员: uint64_t value = (uint64_t)(size_t) ptr;

答案 2 :(得分:0)

我可以想出两种方法来做到这一点。通过第一种方式调用foo来解决我的问题

  1. FOO((无效*)(uint32_t的)地址)
  2. 这只是因为我对foo的输入始终是32位值。返回的值可以是64位。

    1. 当然,如果我可以修改它,一个正确的修复就是改变foo本身。 我可以传递foo(&地址)。在foo里面,retAddr = * pBuf。
    2. 感谢所有的建议!