Unions
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
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
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.
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).
- Brug en
union Datamed to medlemmer:int aogchar b. - I et
for-loop itereres over arrayets elementer fra0tiln. - Tildel det aktuelle element i arrayet til unionens
int-medlem (data.a). - Udskriv heltalsværdien
data.aog tegnrepræsentationendata.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
Tak for dine kommentarer!
single
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
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?
Fantastisk!
Completion rate forbedret til 4.35
Unions
Stryg for at vise menuen
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
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
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.
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).
- Brug en
union Datamed to medlemmer:int aogchar b. - I et
for-loop itereres over arrayets elementer fra0tiln. - Tildel det aktuelle element i arrayet til unionens
int-medlem (data.a). - Udskriv heltalsværdien
data.aog tegnrepræsentationendata.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
Tak for dine kommentarer!
single