The C Standard, 6.7.3.2 .1 paragraph 19 [ISO/IEC 9899:20112024], states
There may be unnamed padding within a structure object, but not at its beginning. . . . There may be unnamed padding at the end of a structure or union.
Subclause 6.7.911, paragraph 910, states that
unnamed members of objects of structure and union type do not participate in initialization. Unnamed members of structure objects have indeterminate value representation even after initialization.
The only exception is that padding bits are set to zero when a static or thread-local object is implicitly initialized (paragraph10paragraph 11):
If an object that has automatic static or thread storage duration is not initialized explicitly, its value is indeterminate. If an object that has static or thread storage duration is not initialized explicitly, then:or any object is initialized with an empty initializer, then it is subject to default initialization, which initializes an object as follows:
— if — if it is an aggregate, every member is initialized (recursively) according to these rules, and any padding is initialized to zero bits;
— — if it is a union, the first named member is initialized (recursively) according to these rules, and any padding is initialized to zero bits;.
Because these padding values are unspecified, attempting a byte-by-byte comparison between structures can lead to incorrect results [Summit 1995].
...
Bibliography
| [ISO/IEC 9899:20112024] | 6.7.3.2.1, "Structure and Union Specifiers" 6.7.911, "Initialization" |
| [Summit 1995] | Question 2.8 Question 2.12 |
...