The size of a structure is not always equal to the sum of the sizes of its members. Subclause 18.104.22.168 of the C Standard states, "There may be unnamed padding within a structure object, but not at its beginning" [ISO/IEC 9899:2011].
This unnamed padding is often called structure padding. Structure members are arranged in memory as they are declared in the program text. Padding may be added to the structure to ensure the structure is properly aligned in memory. Structure padding allows for faster member access on many architectures.
Rearranging the fields in a
struct can change the size of the
struct. It is possible to minimize padding anomalies if the fields are arranged in such a way that fields of the same size are grouped together.
Padding is also called
struct member alignment. Many compilers provide a flag that controls how the members of a structure are packed into memory. Modifying this flag may cause the size of the structures to vary. Most compilers also include a keyword that removes all padding; the resulting structures are called packed structures. Overriding the default behavior is often unwise because it leads to interface compatibility problems (the nominally same
struct has its layout interpreted differently in different modules).
Noncompliant Code Example
This noncompliant code example assumes that the size of
struct buffer is equal to the sum of the size of its individual components, which may not be the case [Dowd 2006]. The size of
struct buffer may actually be larger because of structure padding.
Accounting for structure padding prevents these types of errors:
Failure to correctly determine the size of a structure can lead to subtle logic errors and incorrect calculations, the effects of which can lead to abnormal program termination, memory corruption, or execution of arbitrary code.
|Supported: Astrée reports accesses outside the bounds of allocated memory.|
|LDRA tool suite|
|SEI CERT C++ Coding Standard||VOID EXP03-CPP. Do not assume the size of a class or struct is the sum of the sizes of its members|
|[Dowd 2006]||Chapter 6, "C Language Issues" ("Structure Padding," pp. 284–287)|
|[ISO/IEC 9899:2011]||Subclause 22.214.171.124, "Structure and Union Specifiers"|
|[Sloss 2004]||Section 5.7, "Structure Arrangement"|