Frage zum Union in C

Neue Frage »

Auf diesen Beitrag antworten »
Matze84 Frage zum Union in C

Ich brauch mal echt keinen Weg, sondern nur eine kurze Erklärung, weil ein Kumpel und ich gerade am Verzweifeln sind.....

Ein Union ist doch folgendermaßen Definiert (ähnlich einem struct)

typedef union "Datentyp"
{
int i;
char c;
}"Name";

?????

Warum funktioniert beides???
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
typedef union xcht_t
{
	unsigned int uiValue;
	unsigned char ucByte[2];
};

int _tmain(int argc, _TCHAR* argv[])
{
	xcht_t myxcht;
	myxcht.uiValue = 5;
	printf("%i", myxcht.uiValue);
	return 0;
}

UND
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
typedef union
{
	unsigned int uiValue;
	unsigned char ucByte[2];
}xcht_t;

int _tmain(int argc, _TCHAR* argv[])
{
	xcht_t myxcht;
	myxcht.uiValue = 5;
	printf("%i", myxcht.uiValue);
	return 0;
}


Geändert wurde nur Zeile 1 und Zeile 5.
Warum kann ich mit beiden Wegen Zeile 9 realisieren?
Ich dachte beim 2ten Beispiel ist das quasi der "Name"
also wie "i" bei "int i"

ich hoffe es ist einigermaßen verständlich was ich meine...
 
Auf diesen Beitrag antworten »
Karlito

Hallo,

der Unterschied zwischen der ersten und der zweiten Definition ist, dass einmal ein Typ xcht_t deklariert wird und bei der zweiten definition wird ein anonymer Typ mit dem Alias xcht_t deklariert.
Genauer könnt ihr das hier nachlesen.

Ein Union ist ein stück Speicher, welches so groß ist wie der größte Typ den es beinhaltet. Der Compiler weiß anhand des angesprochenen Namens welcher Typ tatsächlich angesprochen wird. Speicher ist Speicher, egal was drin steht. Nur der Compiler weiß, wie er den Speicher interpretieren muss.

Beispiel:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv){
	char memory[100];
	*(int *)memory = 0x1244;
	
	printf("*(int *)memory = 0x1244;\n");
	printf("Speicher als Int: %X, %d\n", *(int *)memory, *(int *)memory);
	printf("Speicher als char: %X, %c\n", *(char *)memory, *(char *)memory);

	*(char *)memory = 'B';
	printf("\n");
	printf("*(char *)memory = 'B';\n");
	printf("Speicher als Int: %X, %d\n", *(int *)memory, *(int *)memory);
	printf("Speicher als char: %X, %c\n", *(char *)memory, *(char *)memory);

	*(int *)memory = 0x1234;
	printf("\n");
	printf("*(int *)memory = 0x1234;\n");
	printf("Speicher als Int: %X, %d\n", *(int *)memory, *(int *)memory);
	printf("Speicher als char: %X, %c\n", *(char *)memory, *(char *)memory);

	sprintf((char *)memory, "Test");
	printf("\n");
	printf("sprintf((char *)memory, \"Test\");\n");
	printf("Speicher als Int: %X, %d\n", *(int *)memory, *(int *)memory);
	printf("Speicher als char: %X, %c\n", *(char *)memory, *(char *)memory);
	printf("Speicher als string: %s\n", (char *)memory);

	return EXIT_SUCCESS;
}


In diesem Beispiel simuliere ich ein Union aus einem char[100], einem Int und einem einzelnen char. Man Sieht, dass die Interpretation des Speichers nur von der Konvertierung abhängt. So ähnlich macht das der Compiler anhand des Namens.

Ist das klar?

VG,

Karlito
Auf diesen Beitrag antworten »
Matze84

Ok Vielen Dank, dann ist alles klar...
was ein Union ist und so wussten wir...
trotzdem danke.

aber warum die beiden sachen quasi das gleiche sind....
aber nachdem ich mir den Link AUCH nochmal durchgelesen habe wissen wir jetzt bescheid.

Also

DANKE
Auf diesen Beitrag antworten »
Karlito

Huch, Frage nicht richtig gelesen. Sorry!

VG,

Karlito
 
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »