假设sizeof(double)> = sizeof(void *)是否安全?

时间:2012-07-03 10:45:22

标签: c portability sizeof c99 void-pointers

假设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));

It does work在我测试过的几台机器上,但是如果sizeof(void*) > sizeof(double)我可以看到这种情况非常糟糕。

2 个答案:

答案 0 :(得分:3)

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

在任何情况下,依赖doublevoid *之间的任何关系似乎都是一个非常糟糕的主意......

答案 1 :(得分:1)

尺寸与它无关。总会有一些比特存储在那里,并且大小总是足够大以容纳void*。会出现问题的是你将一个几乎随机的位模式解释为一个指针,这除了崩溃之外没什么其他作用,但很可能你已经知道了。不要这样做。