为什么将指针铸成数字类型是不安全的

Why it is not safe casting a pointer to a numeric type?

本文关键字:类型 不安全 数字 指针 为什么      更新时间:2023-10-16

考虑此代码

T* pa = new T(13);
int address = reinterpret_cast<int>(pa);

t可以是任何内置类型。

1)我不明白在此处重新诠释的重新解释是什么?

2)这种铸造会导致不确定行为的情况如何?

3)pa将始终包含内存地址的正确十进制表示?

我不明白在此处重新诠释的重新解释是什么?

因为标准不需要int S和指针具有相同的大小,因此您可能会通过铸造丢失信息。

这种铸造会导致不确定行为的情况如何?

这是真的:

1 << (sizeof(T*) * CHAR_BIT) > INT_MAX

那么,地址的值可能无法填充int,它调用了未定义的行为。

pa将始终包含内存地址的正确小数表示?

如果您使用std :: [u] intptr_t,那么是的,因为这些类型可以保证能够保持指针的值。

T*int的大小取决于您的编译器和架构。

如果sizeof(T*) > sizeof(int)您会丢弃信息。虽然在一个编译器上可能是正确的,并且在另一个编译器上可能不正确。

您可以使用std::intptr_tstd::uintptr_t而不是int。这两个保证足够大以保持指针的价值。

正如其他答案所指出的那样,整数的大小和指针的大小不必相同。例如,在许多64位Intel机器上,指针为64位,整数仅为32。

不过,还有其他原因也可以防止这种情况。例如,某些较旧的处理器体系结构具有整数表示,其中包括陷阱表示,如果使用的话会导致不确定的行为。这意味着,原则上,指针可以适合整数的大小,但是施放指针指向整数可能会导致陷阱表示,从而导致进一步的数字计算失败。