1

假设sizeof(double)总是大于或等于是否安全sizeof(void*)

在某些情况下,以下是可移植的吗?

int x = 100;
double tmp;

union {
  double dbl;
  void* ptr;
} conv;

conv.ptr = (void*)&x;
tmp = conv.dbl;

conv.dbl = tmp;
printf("%d\n", *((int*)conv.ptr));

它确实可以在我测试过的几台机器上运行,但是如果sizeof(void*) > sizeof(double).

4

2 回答 2

3

在当前系统上是的。在所有当前和未来的double系统上都是64 位,因为它们与 IEEE 算术的双精度对齐。将来指针可能会更大是不可能的但肯定有可能 - 可能不是为了更大的地址空间,而是为了携带它们的边界信息。

无论如何,依赖double和之间的任何关系似乎是一个非常糟糕的主意void *......

于 2012-07-03T13:32:18.357 回答
1

大小与它无关。总会有一些位存储在那里,并且大小总是足够大以容纳void*. 会出错的是您将几乎随机的位模式解释为指针,除了崩溃之外,这无能为力,但很可能您已经知道了。不要这样做。

于 2012-07-03T11:30:48.010 回答