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
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Beherskelse af C Structs

bookUnions

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 anvendes sjældent, men de er nyttige, når du ønsker en variabel, der kan indeholde forskellige datatyper på forskellige tidspunkter og samtidig spare hukommelse.

Dataen 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 svarer til størrelsen på det største medlem.

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

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

main.c

main.c

copy
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

copy
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 unionens minimumsstørrelse 20 bytes. Kompileren kan dog tilføje ekstra bytes for justering, så double eller int starter ved den korrekte hukommelsesgrænse. Derfor 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 muliggør 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. I et for-loop itereres 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

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

Suggested prompts:

Can you explain more about how unions save memory compared to structs?

What are some practical examples where using a union is beneficial?

How does alignment and padding affect the size of a union?

close

bookUnions

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 anvendes sjældent, men de er nyttige, når du ønsker en variabel, der kan indeholde forskellige datatyper på forskellige tidspunkter og samtidig spare hukommelse.

Dataen 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 svarer til størrelsen på det største medlem.

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

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

main.c

main.c

copy
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

copy
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 unionens minimumsstørrelse 20 bytes. Kompileren kan dog tilføje ekstra bytes for justering, så double eller int starter ved den korrekte hukommelsesgrænse. Derfor 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 muliggør 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. I et for-loop itereres 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

some-alt