我有一个结构:
struct TypeValue{
u8 type;
union{
u8 u8value;
s8 s8value;
}value;
}
根据类型var,我们可以使用u8value
或s8value
的值。
现在我有一个结构TypeValue
,我想获得指向value
元素的空指针(不关心指针类型),哪一个是正确的:
void *ptr = &typevalue.value (1)
OR
void *ptr = &typevalue.value.u8value (2)
(把它放在for循环中,根据类型找到正确的值)
当然(2)是一种正确的方法,但我必须遍历数据类型以获得正确的指针以获得正确的值。但问题是if(1)是否正确,因为我想知道指向union的指针是否等于指向其元素的指针? 大/小端会影响结果吗?
答案 0 :(得分:3)
void *ptr = &typevalue.value
会这样做,因为C标准(N1570,6.7.2.1结构和联合说明符)说:
16联盟的大小足以容纳其中最大的成员。 at的值 大多数成员可以随时存储在union对象中。 指向a的指针 联合对象,适当转换,指向其每个成员(或如果成员有点 - 字段,然后到它所在的单位),反之亦然。
地址仅在当前运行环境中有意义(您不会将地址存储到闪存中),因此地址的字节顺序并不重要。
答案 1 :(得分:2)
这三个想法是正确的。
void *ptr = &(typevalue.value.u8value);
void *ptr = &(typevalue.value.s8value);
void *ptr = &(typevalue.value);
union是内存中的结构,它采用内部声明的较大类型的大小。所有字段都使用相同的内存空间,只是给定义提供了语义信息。
答案 2 :(得分:0)
void *ptr = &(typevalue.value.u8value);
我会这样写。
并且不,耐力不会影响结果。