在void指针中存储整数的往返安全性

问题描述 投票:4回答:2

this article中,提到了关于整数和指针的reinterpret_cast的以下内容:

(不保证相反方向的往返转换;同一指针可能有多个整数表示)

我是否正确理解标准不能保证以下内容:

intptr_t x = 5; 
void* y = reinterpret_cast<void*>(x);
assert(x == reinterpret_cast<intptr_t>(y));

有人可以证实吗?

c++ pointers language-lawyer reinterpret-cast
2个回答
3
投票

你的解释是正确的。该标准的相关段落是C ++ 17中的[expr.reinterpret.cast] / 5:

可以将整数类型或枚举类型的值显式转换为指针。转换为足够大小的整数(如果实现上存在任何此类)并返回相同指针类型的指针将具有其原始值;指针和整数之间的映射在其他方面是实现定义的。 [注意:除非在6.7.4.3中描述,否则这种转换的结果将不是安全派生的指针值。 - 结束说明]

因此,虽然从指针到整数的映射保证具有左反(因此是单射的),但不保证它是双射的;它是否是“实现定义”行为的一部分。正如cppreference指出的那样,可能有几个整数转换为相同的指针。


0
投票

可能没有与平台地址空间的宽度完全匹配的整数类型。 intptr_t必须足够大以容纳任何指针值,这意味着它比指针大或大,当它更大时,鸽笼原则保证每个整数值不可能具有唯一的void*值。

© www.soinside.com 2019 - 2024. All rights reserved.