将 8 位指针转换为 long

casting 8-bit pointer to long

我正在尝试在我的 c++ 项目中使用第 3 方 c 库,该项目是我在 Windows 64 位上使用 Visual Studio 开发的。 32位和64位都编译成功;然而,当 64 位 运行 时,我在外部库中发现了一个问题,如下所示:

double* foo(){
     double* b; long a; long i;
     /*
       ... do some stuff to assign values to b, a, i ...
     */
     return ( (long)b + a + i );
}

问题是(至少在 windows 上)double* 在 x86 架构中由 4 个字节表示,在 x64 中由 8 个字节表示,因此 b 在 return 中的转换声明被搞砸了。

我的问题是,有没有办法从指针 b 的 8 位表示中 "extract" 指针的 4 字节地址,从而保持表达式 (b+a)有意义吗?

谢谢

大概是为了避免对 sizeof(double) 的倍数进行指针算术运算。

您可以对 char * 指针执行相同的操作,从而完全避免大小问题。我还添加了转换回原始指针类型的代码丢失。

return (double *)( (char *)b + a + i );

注意:您应该知道,您可以轻松创建未对齐的指针,如果解除引用,这会导致未定义的行为。这也是您的原始代码的问题。

小心;你的代码看起来很可疑,它可能还有其他潜在的地雷。