同类型的联盟成员

PSk*_*cik 5 c unions

假设我有一个具有两个成员ab具有相同类型的联合u (例如,int).

union u{
    int a,b;
    char c;
};
Run Code Online (Sandbox Code Playgroud)

如果我写入a,通过值传递给函数,并且函数读取b,期望获得a值,是否会有任何问题,考虑ab具有相同的类型?成员读取是否需要镜像成员写入?

unw*_*ind 4

是的,没关系。

标准(C11草案)说:

[...]如果一个联合包含多个共享公共初始序列的结构(见下文),并且如果联合对象当前包含这些结构之一,则允许在任何地方检查它们中任何一个的公共初始部分联合的完整类型的声明是可见的

这里两个整数可以被认为是共享相同初始序列的(非常简单的)结构。

即使忽略这一点,还有:

如果用于读取联合对象内容的成员与最后用于在对象中存储值的成员不同,则该值的对象表示形式的适当部分将被重新解释为新类型中的对象表示形式

将 an 重新解释int为 anint是相当安全的。:)