假设一个工会是这样的:

union {
  uint16_t halfwords[32];
  uint32_t fullwords[16];
} my_union;

严格的别名规则说明了什么。
my_union.fullwords[0] = 1;
printf("%d", my_union.halfwords[1]);

就严格的别名规则而言,是将my_union.halfwords[1]视为对联合体的一部分的合法访问,还是将其视为获取恰好指向halfwords的第一个元素的地址,然后对该地址执行非法的uint16_t读取(然后编译器可以接受该地址作为它想做的任何事情的邀请)。
从语义上看,似乎任何一个理智的编译器都拥有将其识别为联合体成员所需的所有信息,但标准中是否有要求编译器这样做的内容?
如果有必要将一个数组或其中的一部分传递给另一个函数,那么仍然可以通过Union访问另一个数组吗?
如果需要将一个数组传递给一个方法,而将另一个传递给另一个方法,那么在这些操作之间是否可以执行任何有效的操作,以确保编译器不认为违反了严格的别名?

最佳答案

这确实是允许的。在C语言中,C11标准明确允许使用类型双关语。
如果您想对此有更好的了解,请参见here
附言:不要投票,我发布这个只是为了方便访问,内容不是我自己想回答的,而是我在提供的链接中读到的摘要。
编辑:我找到了this的解释,看起来和你要找的差不多。它至少意味着您可以通过联合直接写入数组。

关于c - union 中的并行数组与严格别名有何关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33095622/

10-12 00:20
查看更多