如何将 const void* 转换为 unsigned int?

Posted

技术标签:

【中文标题】如何将 const void* 转换为 unsigned int?【英文标题】:How to convert const void* to unsigned int? 【发布时间】:2018-11-23 01:49:08 【问题描述】:

所以在这段代码中:

unsigned int lptr = lua_topointer(L, -1);

它给出了错误: 无法从 'const void *' 转换为 'unsigned int'

我尝试过 reinterpret_cast 将其转换为:

unsigned int lptr = reinterpret_cast<const void*>(lua_topointer(L, -1)));

但它给了我另一个错误: “const void*”类型的值不能用于初始化“unsigned int”类型的实体

任何帮助将不胜感激。

【问题讨论】:

你为什么要这样做?您是否尝试获取地址的整数值以便打印? 【参考方案1】:

lua_topointer 返回一个void const*。您的 reinterpret_cast 实际上并没有改变任何东西。你需要写的是:

unsigned int value = reinterpret_cast<unsigned int>(lua_topointer(L, -1)));

但请记住,这仅适用于int 大小恰好与指针大小匹配的平台。最好使用&lt;cstdint&gt; 中的std::uintptr_t,因为可以保证大小匹配。

std::uintptr_t value = reinterpret_cast<std::uintptr_t>(lua_topointer(L, -1)));

【讨论】:

【参考方案2】:

不清楚将 void 指针转换为整数是什么意思。如果你打算访问指向的对象,那么请看lua_topointer的文档:

将给定可接受索引处的值转换为通用 C 指针 (void*)。该值可以是用户数据、表、线程或函数;否则,lua_topointer 返回 NULL。不同的对象会给出不同的指针。 无法将指针转换回其原始值。

通常此函数仅用于调试信息。

另请注意,根据引用的文档,指向的对象不能是unsigned int


如果您打算将指针表示为整数,首先我建议您考虑为什么要这样做。通常不需要它。大多数可以用整数表示来完成的合理的事情,比如打印,都可以直接用指针本身来完成。

但是如果你真的想要将指针“转换”为整数,unsigned int 不是一个好的选择,因为它不能保证能够表示可以表示的所有值一个数据指针。std::uintptr_t 可以表示所有这些值,这是正确的转换方式:

reinterpret_cast<std::uintptr_t>(data_pointer)

【讨论】:

reinterpret_cast 指向大小相等或更大的整数类型的指针也是正确的 (en.cppreference.com/w/cpp/language/reinterpret_cast) @PeterRuderman 好点。我不建议使用 memcpy。

以上是关于如何将 const void* 转换为 unsigned int?的主要内容,如果未能解决你的问题,请参考以下文章

将 const void* 转换为 const int*

C++ const void* 转换

void Test::printxy(void)' : 不能在 const 类中将 'this' 指针从 'const Test' 转换为 'Test &'

C ++:将void *转换为基类指针时访问冲突

qsort 给出 [错误]:从 `int (*)(cricketer*, cricketer*)' 到 `int (*)(const void*, const void*)' 的无效转换

如何将 unsigned long long int 转换为 unsigned char*?