Pack
Using #pragma pack
can reduce the overall size of a structure or ensure precise alignment for specific cases, such as network protocols or hardware interfaces.
main
#include <stdio.h> #include <stdint.h> // Without using `#pragma pack` struct Packet { uint8_t flag; // 8 bits or 1 bytes uint16_t length; // 16 bits or 2 bytes uint8_t type; // 8 bits or 1 bytes }; int main() { printf("Size without packing: %zu bytes\n", sizeof(struct Packet)); return 0; }
As you may recall, structure alignment is determined by the largest field within the structure.
Using #pragma pack
main
#include <stdio.h> #include <stdint.h> #pragma pack(push, 1) struct PacketPacked { uint8_t flag; // 8 bits = 1 bytes uint16_t length; // 16 bits == 2 bytes uint8_t type; // 8 bits == 1 bytes }; #pragma pack(pop) int main() { printf("Size with packing: %zu bytes\n", sizeof(struct PacketPacked)); return 0; }
The directive #pragma pack(push, 1)
creates a local alignment context for a structure.
You start a new alignment scope with push
, apply a specific rule (here, 1-byte alignment), define the structure, then restore the previous alignment with pop
.
Using push
with 1
ensures that all fields are aligned on 1-byte boundaries, with no padding between them.
Swipe to start coding
You're working with a digital sensor that sends binary data packets over UART. Each packet follows a fixed 4-byte layout. To match this exact layout with no padding, use the #pragma pack
directive to enforce 1-byte alignment.
Bytes | Field | Type |
---|---|---|
1 | Command code | uint8_t |
2 | Sensor value | uint16_t |
1 | Checksum | uint8_t |
- Fill in the first
___
to start the packed context with 1-byte alignment. - Fill in the second
___
to restore default alignment after the struct. - Use the correct field access expressions (e.g.
packet.cmd
) in eachprintf
to output: the command byte, the 2-byte value and the checksum byte.
Solution
Thanks for your feedback!