【问题标题】:Storing double* in a long (C++)将 double* 存储在 long (C++) 中
【发布时间】:2012-07-12 10:12:16
【问题描述】:

因此,当目标平台为 32 位时,我拥有可以在 Visual Studio 2005 中完美编译的现有代码。但是,它不适用于 64 位。我不明白为什么;事实上,我很久以前从未见过指针被强制转换。它甚至是正确的 C++ 吗?

#define REAL double
typedef REAL* point; 
point *ptary; //(so it's basically double** ptary?)
long arylen = (long) ptary[0]; 

提前致谢。

【问题讨论】:

  • 在语言方面是正确的,但是当人们警告投射时,正是出于这样的原因(以及其他原因),即缺乏可移植性。
  • 请注意,long 在 64 位 Linux 和其他平台上是 64 位的,因此这是在将代码移植到 Windows 时常见的错误。

标签: c++ winapi pointers long-integer win64


【解决方案1】:

它似乎在 32 位系统上工作,因为指针和长整型都是 32 位宽。它无法在 64 位系统上工作,因为指针是 64 位宽,但 long(可能)仍然只有 32 位宽。

您可以通过打印出sizeof(double*)sizeof(long) 轻松检查这一点。我的猜测是,在 64 位系统上输出将分别为 8 和 4。

如果您需要一个能够保存指针的整数类型,请使用<stdint.h> 中的intptr_t

【讨论】:

  • 另请注意,将指针转换为整数(反之亦然)是实现定义的操作。对于某些编译器/实现,它可能会满足您的期望,但对于其他编译器/实现则不然。 intptr_tuintptr_t 是可选类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 2017-12-22
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多