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 eachprintfto output: the command byte, the 2-byte value and the checksum byte.
Løsning
Takk for tilbakemeldingene dine!
single
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
What is the syntax for using #pragma pack with push and pop?
Can you explain when to use #pragma pack(push, 1) in real-world scenarios?
Are there any drawbacks or risks to using 1-byte alignment with #pragma pack?
Awesome!
Completion rate improved to 5.56
Pack
Sveip for å vise menyen
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 eachprintfto output: the command byte, the 2-byte value and the checksum byte.
Løsning
Takk for tilbakemeldingene dine!
single