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

Informatiker Board » Themengebiete » Praktische Informatik » Frage zum Union in C » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 4 Beiträge
Karlito

Huch, Frage nicht richtig gelesen. Sorry!

VG,

Karlito
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
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
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...