Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Unions | Forståelse af Structs og Hukommelse
C Structs
Sektion 3. Kapitel 3
single

single

Unions

Stryg for at vise menuen

Note
Definition

En union er en brugerdefineret datatyp i C, der ligner en struktur. Den væsentligste forskel er, at alle dens medlemmer deler den samme hukommelsesplacering. På et givent tidspunkt kan kun ét medlem indeholde en værdi.

Unions bruges sjældent, men de er nyttige, når du ønsker en variabel, der kan indeholde forskellige datatyper på forskellige tidspunkter og samtidig spare hukommelse.

Dataene er placeret i det samme hukommelsesområde for alle medlemmer af unionen. Dette betyder, at alle medlemmer af unionen deler den samme hukommelsesadresse, og størrelsen af unionen er lig med størrelsen af dets største medlem.

struct+vs+union

Hovedformålet med en union er at pålægge forskellige datatyper på ét fælles hukommelsesområde, det vil sige at repræsentere ét hukommelsesområde som forskellige datatyper.

Da felterne i en union deler samme hukommelsescelle, kan de samme data behandles på forskellige måder:

main.c

main.c

12345678910111213141516
#include <stdio.h> // declaring a union union Data { int a; char b; } data; int main() { data.a = 77; // assigning a value to variable a printf("Value of data.a: %d\n", data.a); printf("Value of data.b: %c\n", data.b); return 0; }

I eksemplet deler variablerne data.a og data.b den samme hukommelse. Vi tildelte værdien 77 til a, men vi kan fortolke de samme bytes som et tegn i b.

Justering i unions

Ligesom strukturer bruger unions også justering og udfyldning. Kompileren kan tilføje ekstra bytes, så hvert medlem starter ved den korrekte hukommelsesgrænse.

main.c

main.c

12345678910111213
#include <stdio.h> union Data { int a; // 4 bytes double b; // 8 bytes char c[20]; // 20 bytes }; int main() { printf("Size of union Data: %zu bytes\n", sizeof(union Data)); return 0; }

En union kan kun gemme én værdi ad gangen, og dens størrelse svarer til størrelsen af dens største medlem. I eksemplet med int a (4 bytes), double b (8 bytes) og char c[20] er minimumsstørrelsen af unionen 20 bytes. Kompileren kan dog tilføje ekstra bytes for justering, så double eller int starter ved den korrekte hukommelsesgrænse. Som resultat kan sizeof(union Data) være større end 20, for eksempel 24 bytes.

Opgave

Swipe to start coding

Unionen Data gemmer hver værdi som en int og giver adgang til den samme værdi som en char. Funktionen skal iterere over arrayet og udskrive hver værdi både som et heltal og som det tilsvarende ASCII-tegn.

Funktionen modtager to parametre: et array af heltal (values) og dets længde (n).

  1. Brug en union Data med to medlemmer: int a og char b.
  2. Iterér i et for-loop over arrayets elementer fra 0 til n.
  3. Tildel det aktuelle element i arrayet til unionens int-medlem (data.a).
  4. Udskriv heltalsværdien data.a og tegnrepræsentationen data.b.

Eksempel

{65, 66, 67, 68, 69} =>

Value as int: 65, Value as char: A
Value as int: 66, Value as char: B
Value as int: 67, Value as char: C
Value as int: 68, Value as char: D
Value as int: 69, Value as char: E

Løsning

Switch to desktopSkift til skrivebord for at øve i den virkelige verdenFortsæt der, hvor du er, med en af nedenstående muligheder
Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 3. Kapitel 3
single

single

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

some-alt