Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Frage zum Union in C » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Frage zum Union in C
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Matze84
Eroberer


Dabei seit: 14.10.2012
Beiträge: 73

Frage zum Union in C Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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...
16.04.2013 13:11 Matze84 ist offline Beiträge von Matze84 suchen Nehmen Sie Matze84 in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
16.04.2013 14:29 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Matze84
Eroberer


Dabei seit: 14.10.2012
Beiträge: 73

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
16.04.2013 15:32 Matze84 ist offline Beiträge von Matze84 suchen Nehmen Sie Matze84 in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Huch, Frage nicht richtig gelesen. Sorry!

VG,

Karlito
16.04.2013 20:56 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Frage zum Union in C