为什么成员y在以下代码中设置为0?

Jam*_*man 3 c struct unions static-initialization

我无法弄清楚为什么会这样.我正在使用一堆非常复杂的结构,联合,两者的未命名版本,静态变量等......但我确信这应该有效.经过一天的调试,我已经将问题缩小到以下代码中发生的情况.我正在使用-fms-extensions,这似乎不适合这种情况:

//main.c
//Why does y get set to 0 in the case of 'Breaks'?
//Compile with gcc -fms-extensions main.c

#include <stdio.h>

struct Base {
    int x;
    int y;
};

struct Extend {
    union {
        int X;
        struct Base;
    };
};

struct AlsoExtend {
    struct Base;
    int z;
};

static struct Extend Works = {
    .x = 5,
    .y = 3,
    //.X = 2
};

static struct Extend Breaks = {
    .x = 5,
    .y = 3,
    .X = 2
};

static struct AlsoExtend AlsoWorks = {
    .x = 5,
    .y = 3,
    .z = 69
};

int main(int argc, char** argv) {

    printf("Works: x:%d y:%d X:%d\n", Works.x, Works.y, Works.X);
    printf("Breaks: x:%d y:%d X:%d\n", Breaks.x, Breaks.y, Breaks.X);
    printf("AlsoWorks: x:%d y:%d z:%d\n", AlsoWorks.x, AlsoWorks.y, AlsoWorks.z);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

lbo*_*onn 5

C99规范 的状态是:

当值存储在union类型的对象的成员中时,对象表示的字节与该成员不对应但与其他成员对应的字节采用未指定的值.

在这里,您使用union类型的一个对象写入一个值,并在尝试访问此union类型的另一个对象之后.这会导致您的类型具有不可预测的价值.

因此,你不能做这样的事情.对于同一个结构实例,您应该只使用union的一个对象.