指向工会成员的指针

时间:2014-06-03 08:05:45

标签: c pointers member unions

我有一个结构:

struct TypeValue{
 u8 type;
 union{
   u8 u8value;
   s8 s8value;
 }value;
}

根据类型var,我们可以使用u8values8value的值。 现在我有一个结构TypeValue,我想获得指向value元素的空指针(不关心指针类型),哪一个是正确的:

void *ptr = &typevalue.value (1)
OR
void *ptr = &typevalue.value.u8value (2)

(把它放在for循环中,根据类型找到正确的值)

当然(2)是一种正确的方法,但我必须遍历数据类型以获得正确的指针以获得正确的值。但问题是if(1)是否正确,因为我想知道指向union的指针是否等于指向其元素的指针? 大/小端会影响结果吗?

3 个答案:

答案 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);

我会这样写。

并且不,耐力不会影响结果。