9.91 #pragma pack(n)

This pragma aligns members of a structure to the minimum of n and their natural alignment. Packed objects are read and written using unaligned accesses.

Note

This pragma is a GNU compiler extension that the ARM compiler supports.

Syntax

#pragma pack(n)
Where:
n
is the alignment in bytes, valid alignment values being 1, 2, 4 and 8.

Default

The default is #pragma pack(8).

Errors

Taking the address of a field in a #pragma packed struct does not yield a __packed pointer, so the compiler does not produce an error if you assign this address to a non-__packed pointer. However, the field might not be properly aligned for its type, and dereferencing such an unaligned pointer results in undefined behavior.

Examples

This example demonstrates how pack(2) aligns integer variable b to a 2-byte boundary.
typedef struct
{ 
    char a;
    int b;
} S;
#pragma pack(2)
typedef struct
{ 
    char a;
    int b;
} SP;
S var = { 0x11, 0x44444444 };
SP pvar = { 0x11, 0x44444444 };
The layout of S is:
Figure 9-1 Nonpacked structure S
To view this graphic, your browser must support the SVG format. Either install a browser with native support, or install an appropriate plugin such as Adobe SVG Viewer.

The layout of SP is:
Figure 9-2 Packed structure SP
To view this graphic, your browser must support the SVG format. Either install a browser with native support, or install an appropriate plugin such as Adobe SVG Viewer.

Note

In this layout, x denotes one byte of padding.
SP is a 6-byte structure. There is no padding after b.
Related concepts
4.34 The __packed qualifier and unaligned data access in C and C++ code
4.39 Comparisons of an unpacked struct, a __packed struct, and a struct with individually __packed fields, and of a __packed struct and a #pragma packed struct
Related reference
9.63 __attribute__((packed)) variable attribute
9.56 __attribute__((packed)) type attribute
9.12 __packed
10.4 Structures, unions, enumerations, and bitfields in ARM C and C++
Non-ConfidentialPDF file icon PDF versionARM DUI0375E
Copyright © 2007, 2008, 2011, 2012, 2014 ARM. All rights reserved.