【发布时间】:2015-05-12 04:41:00
【问题描述】:
给定
typedef union { unsigned char b; long l; } BYTE_OR_LONG;
拥有一个函数是否合法
unsigned long get_byte_or_long(BYTE_OR_LONG *it)
{
if (it->b)
return it->b;
else
return decode_long(it->l); // Platform-dependent method
// Could return (it), (it>>8), etc.
}
然后调用它
void test()
{
long l = encode_long(12345678); // Platform-dependent; could return
// (it<<8), (it & 16777215), etc.
char b[2] = {12,34};
BYTE_OR_LONG *bl[3];
bl[0] = (BYTE_OR_LONG*)&l;
bl[1] = (BYTE_OR_LONG*)b;
bl[2] = (BYTE_OR_LONG*)(b+1);
for (int i=0; i<3; i++)
printf("%lu\n", get_byte_or_long(bl[i]));
}
当然构造一个未对齐的BYTE_OR_LONG *p 然后访问p->l 将是未定义的行为。此外,即使将未对齐的指针强制转换为(unsigned long*) 的行为也会是未定义行为,因为对于这种类型的实现可能不需要像char* 那样多的位。然而,有了工会,事情似乎还不清楚。
据我了解,指向联合的指针应该等同于指向其任何元素的指针。这是否意味着保证指向联合类型的指针所需的实现必须能够识别其中包含的任何类型的任何实例[因此BYTE_OR_LONG* 必须能够识别任何unsigned char],还是需要程序员只转换为满足其中每个组成部分的每个对齐要求的联合类型指针?
【问题讨论】:
-
OT:` 应该是
printf("%p\n", (void*) bl[i]);而不是printf("%lu\n", bl[i]); -
@alk:代码在一个重要细节上是错误的——它从未将
bl[i]传递给将要使用它的代码。感谢您的评论-我修复了上面的代码。