c/language/struct initialization

When an object of  or  type, the initializer must be a  brace-enclosed, comma-separated list of initializers for the members:

where the is a sequence (whitespace-separated or adjacent) of individual member designators of the form   and  of the form.

All members that are not initialized explicitly are.

Explanation
When initializing a, the initializer list must have only one member, which initializes the first member of the union.

When initializing a, the first initializer in the list initializes the first declared member, and all subsequent initializers initialize the struct members declared after the one initialized by the previous expression.

It's an error to provide more initializers than members.

Nested initialization
If the members of the struct or union are arrays, structs, or unions, the corresponding initializers in the brace-enclosed list of initializers are any initializers that are valid for those members, except that their braces may be omitted as follows:

If the nested initializer begins with an opening brace, the entire nested initializer up to its closing brace initializes the corresponding member object. Each left opening brace establishes a new current object. The members of the current object are initialized in their natural order: array elements in subscript order, struct members in declaration order, only the first declared member of any union. The subobjects within the current object that are not explicitly initialized by the closing brace are.

If the nested initializer does not begin with an opening brace, only enough initializers from the list are taken to account for the elements or members of the member array, struct or union; any remaining initializers are left to initialize the next struct member: