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.c
1234567891011121314#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.c
123456789101112131415#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.
Lösung
Danke für Ihr Feedback!
single
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Awesome!
Completion rate improved to 5.56
Pack
Swipe um das Menü anzuzeigen
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.c
1234567891011121314#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.c
123456789101112131415#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.
Lösung
Danke für Ihr Feedback!
Awesome!
Completion rate improved to 5.56single