Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Pack | Compiler Directives and Advanced Control
C Preprocessing

Sveip for å vise menyen

book
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.

c

main

copy
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

c

main

copy
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.

Oppgave

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.

BytesFieldType
1Command codeuint8_t
2Sensor valueuint16_t
1Checksumuint8_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 each printf to output: the command byte, the 2-byte value and the checksum byte.

Løsning

Switch to desktopBytt til skrivebordet for virkelighetspraksisFortsett der du er med et av alternativene nedenfor
Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 2
Vi beklager at noe gikk galt. Hva skjedde?

Spør AI

expand
ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

book
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.

c

main

copy
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

c

main

copy
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.

Oppgave

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.

BytesFieldType
1Command codeuint8_t
2Sensor valueuint16_t
1Checksumuint8_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 each printf to output: the command byte, the 2-byte value and the checksum byte.

Løsning

Switch to desktopBytt til skrivebordet for virkelighetspraksisFortsett der du er med et av alternativene nedenfor
Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 2
Switch to desktopBytt til skrivebordet for virkelighetspraksisFortsett der du er med et av alternativene nedenfor
Vi beklager at noe gikk galt. Hva skjedde?
some-alt