将int转换为void指针并再次返回int是否安全?

les*_*ana 6 c c++ pointers

在C和/或C++中:将int转换为void指针并再次返回int是否安全?

基于问题" C++:将指针转换为int并稍后再返回指针是否安全? ".

Ste*_*ker 11

在大多数现代普通机器中,可能.

但是,我敢打赌,有一些模糊的编译器或配置(比如,使用32位整数运算的16位寻址机器),情况并非如此.

一个uintptr_t的保证同时容纳,虽然如此,如果你想使用该类型.


Tho*_*ews 5

这是一个示例,当将整数转换为指针时,将指针转换为整数可能不会导致相同的指针。

给定一个具有 24 位地址并使用两个 16 位数量来描述位置的架构。设一个数量为 SEGMENT,另一个为 OFFSET。位置由符号 SEGMENT:OFFSET 指定。

实际的 24 位(物理)地址计算如下:

address = segment * 16 + offset.
Run Code Online (Sandbox Code Playgroud)

使用这种表示法,可以有多个 SEGMENT:OFFSET 对来描述相同的物理地址。

转换为整数时,使用 32 位(无符号)数量(以简化处理器中的内部计算)。问题是如何将物理地址转换为创建物理地址时使用的相同 SEGMENT::OFFSET。

将整数转换为指针的通用方程是:

offset = address & 0xFFFF; // Mask off high order bits, keep lower 16.
segment = address >> 16;   // Shift address right 16 bits, zero fill.
Run Code Online (Sandbox Code Playgroud)

虽然这个新段的物理地址和偏移量等于原来的 SEGMENT:OFFSET 的物理地址,但不能保证段和偏移量相同。

为了优化代码,有些处理器指令在段中使用相对寻址。当 SEGMENT 值由于从物理地址转换而发生变化时,这些指令可能会变得混乱。

在这种情况下,可以从指针转换为整数。但是,强烈反对从整数转换为指针。运行时可能会出现难以调试的错误。

额外问题:你能说出实际的架构吗?