C++ Structure and Union

vish234

Mitglied
Ich habe vor kurzem begonnen, C++ zu lernen, insbesondere die Ideen von Strukturen und Unions. Ich stehe jedoch vor einer kleinen Hürde und brauche möglicherweise Ihre Fähigkeiten, um mir weiterzuhelfen.

C++:
#include <iostream>

struct MyStruct {
    int x;
    char y;
};

int main() {
    MyStruct s;
    s.x = 10;
    s.y = 'A';

    // Accessing the members of the structure
    std::cout << "x: " << s.x << ", y: " << s.y << std::endl;

    // Trying to access the members of the structure using union
    union MyUnion {
        int x;
        char y;
    };

    MyUnion u;
    u.x = 10;
    std::cout << "x: " << u.x << ", y: " << u.y << std::endl; // Error occurs here

    return 0;
}

Ich erhalte ein Problem, wenn ich versuche, über eine Union auf die Mitglieder der Struktur zuzugreifen. Können Sie erklären, was dieses Problem verursacht und wie man es beheben kann?

Wir würden uns sehr über Ihre Hilfe bei Strukturen und Unions in C++ freuen. Vielen Dank im Voraus für Ihre Hilfe!
 
Zuletzt bearbeitet von einem Moderator:

KonradN

Super-Moderator
Mitarbeiter
Was genau für ein Problem haben sie denn? Der Zugriff sollte klappen, aber das Zeichen in x.y dürfte 0x00 sein (oder falls es hier ein Alignment geben sollte, dann ggf. 0x0a)

Speichere mal den Integer wert 0x30313233 - dann hast du in den Bytes die Char Werte für 0, 1, 2 und 3

Man muss halt verstehen, was da passiert. Da kommt zuerst die Frage auf, wie ein int gespeichert wird. Das ist entweder Little Endian oder big Endian.

Die CPU /Compiler ist auch wichtig: wie groß ist ein int? Ich bin jetzt von 4 Byte ausgegangen aber auf 64Bit könnte es auch 64 Bit sein!

Alignment ist die Frage, wie die Daten abgelegt werden sollen. Wenn Daten z.B.immer alle 4 Byte abgelegt werden, ist die Frage: welches der 4 Bytes nimmt er sich? Das an Position 0 oder das an Position 3. Ich bin da jetzt aber nicht tief genug drin: evtl. ist das auch von der Endianess abhängig. Dann könnte man ggf doch klar sagen, was heraus kommt.
 

M.L.

Top Contributor
Generell hängt C/C++-Code z.B. vom Compiler ab.
Ein kurzes Experiment mit replit.com (freie Version):
C:
...
MyUnion u;
    //u.x = 0;
  u.y = 'A';
    std::cout << "x: " << u.x << ", y: " << u.y << std::endl; ...
ergibt zwar keinen Fehler, aber diese Ausgabe (char-Wert von 'A'):
Code:
x: 10, y: A
x: 65, y: A
 

httpdigest

Top Contributor
Ich erhalte ein Problem, wenn ich versuche, über eine Union auf die Mitglieder der Struktur zuzugreifen. Können Sie erklären, was dieses Problem verursacht und wie man es beheben kann?
Welches "Problem" erhältst du denn?
Kompiliert es nicht? Stürzt das Programm bei Ausführung ab? Gibt es nicht das aus, was du erwartest? Falls letzteres:was gibt es denn bei dir aus und was erwartest du stattdessen?
 

Neue Themen


Oben