2017-02-11 11 views
8

Учитывая эти структуры:Является ли это использование профсоюзов в C действительным/совместимым?

typedef struct { 
    //[...] 
} StructA; 

typedef struct { 
    StructA a; 
    //[...] 
} StructB; 

typedef union { 
    StructA a; 
    StructB b; 
} Union; 

Существуют два метода доступа ниже эквивалентны и не неопределенным?

Union u; 
memcpy(&u.b, /*...*/); //Pretend I populated StructB here 
u.a; // Method 1 
u.b.a; // Method 2 

Обратите внимание, что StructA является первым членом StructB.

Я заметил это в кодовой базе, которая работает, мне просто интересно, стандартно ли это или есть ли какие-либо выравнивания.

ответ

5
typedef union { 
    StructA a; 
    StructB b; 
} Union; 

a имеет то же смещение, как b в объединении: 0

a имеет смещение 0 в StructB.

Звонки эквивалентны.