假设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)
我可以看到这种情况非常糟糕。
答案 0 :(得分:3)
在当前的系统上是的。 所有当前和未来的系统上的double
是64位,因为它们与IEEE算法的双精度对齐。它不太可能,但肯定有可能在将来指针可能更大 - 可能不是为了更大的地址空间,而是为了携带它们的边界信息。
在任何情况下,依赖double
和void *
之间的任何关系似乎都是一个非常糟糕的主意......
答案 1 :(得分:1)
尺寸与它无关。总会有一些比特存储在那里,并且大小总是足够大以容纳void*
。会出现问题的是你将一个几乎随机的位模式解释为一个指针,这除了崩溃之外没什么其他作用,但很可能你已经知道了。不要这样做。