Unioner
En union är en användardefinierad datatyp i C, liknande en struktur. Den största skillnaden är att alla dess medlemmar delar samma minnesplats. Vid varje givet tillfälle kan endast en medlem lagra ett värde.
Unioner används sällan, men de är användbara när du vill ha en variabel som kan innehålla olika typer av data vid olika tillfällen och samtidigt spara minne.
Datan är placerad i samma minnesområde för alla medlemmar i unionen. Detta innebär att alla medlemmar i unionen delar samma minnesadress, och storleken på unionen är lika med storleken på dess största medlem.
Huvudsyftet med en union är att tillåta olika datatyper att dela samma minnesområde, det vill säga att representera ett minnesområde som olika datatyper.
Eftersom fälten i en union delar samma minnescell kan vi behandla samma data på olika sätt:
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 exemplet delar variablerna data.a och data.b samma minne. Vi tilldelade värdet 77 till a, men vi kan tolka samma byte som ett tecken i b.
Justering i unioner
Precis som strukturer använder unioner också justering och utfyllnad. Kompilatorn kan lägga till extra byte så att varje medlem börjar vid rätt minnesgräns.
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 endast lagra ett värde åt gången, och dess storlek motsvarar storleken på dess största medlem. I exemplet med int a (4 byte), double b (8 byte) och char c[20], är unionens minsta storlek 20 byte. Kompilatorn kan dock lägga till extra byte för justering, så att double eller int börjar vid rätt minnesgräns. Därför kan sizeof(union Data) vara större än 20, till exempel 24 byte.
Swipe to start coding
Unionen Data lagrar varje värde som en int och möjliggör åtkomst till samma värde som en char. Funktionen ska iterera över arrayen och skriva ut varje värde både som ett heltal och som motsvarande ASCII-tecken.
Funktionen tar emot två parametrar: en array av heltal (values) och dess längd (n).
- Använd en
union Datamed två medlemmar:int aochchar b. - Iterera över arrayens element från
fortill0med enn-loop. - Tilldela det aktuella elementet i arrayen till unionens
int-medlem (data.a). - Skriv ut heltalsvärdet
data.aoch teckenrepresentationendata.b.
Example
{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
Tack för dina kommentarer!
single
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
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?
Fantastiskt!
Completion betyg förbättrat till 4.35
Unioner
Svep för att visa menyn
En union är en användardefinierad datatyp i C, liknande en struktur. Den största skillnaden är att alla dess medlemmar delar samma minnesplats. Vid varje givet tillfälle kan endast en medlem lagra ett värde.
Unioner används sällan, men de är användbara när du vill ha en variabel som kan innehålla olika typer av data vid olika tillfällen och samtidigt spara minne.
Datan är placerad i samma minnesområde för alla medlemmar i unionen. Detta innebär att alla medlemmar i unionen delar samma minnesadress, och storleken på unionen är lika med storleken på dess största medlem.
Huvudsyftet med en union är att tillåta olika datatyper att dela samma minnesområde, det vill säga att representera ett minnesområde som olika datatyper.
Eftersom fälten i en union delar samma minnescell kan vi behandla samma data på olika sätt:
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 exemplet delar variablerna data.a och data.b samma minne. Vi tilldelade värdet 77 till a, men vi kan tolka samma byte som ett tecken i b.
Justering i unioner
Precis som strukturer använder unioner också justering och utfyllnad. Kompilatorn kan lägga till extra byte så att varje medlem börjar vid rätt minnesgräns.
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 endast lagra ett värde åt gången, och dess storlek motsvarar storleken på dess största medlem. I exemplet med int a (4 byte), double b (8 byte) och char c[20], är unionens minsta storlek 20 byte. Kompilatorn kan dock lägga till extra byte för justering, så att double eller int börjar vid rätt minnesgräns. Därför kan sizeof(union Data) vara större än 20, till exempel 24 byte.
Swipe to start coding
Unionen Data lagrar varje värde som en int och möjliggör åtkomst till samma värde som en char. Funktionen ska iterera över arrayen och skriva ut varje värde både som ett heltal och som motsvarande ASCII-tecken.
Funktionen tar emot två parametrar: en array av heltal (values) och dess längd (n).
- Använd en
union Datamed två medlemmar:int aochchar b. - Iterera över arrayens element från
fortill0med enn-loop. - Tilldela det aktuella elementet i arrayen till unionens
int-medlem (data.a). - Skriv ut heltalsvärdet
data.aoch teckenrepresentationendata.b.
Example
{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
Tack för dina kommentarer!
single