Speicherzugriff bei Unions



  • Hallo,
    wenn ich bei folgender Union

    union
    {
        int number = 0;
        char byte[4];
    };
    

    auf unterschiedlichen Systemen den einzelnen Elementen von byte die gleichen Werte zu weise,
    hat number dann immer den selben Wert?
    Oder nicht weil die Bytes unterschiedlich im Speicher abgelegt sind?
    (Angenommen number ist überall 32 bit groß)
    Danke im Voraus



  • Nein, auf Big-Endian Systemen wirst du ein anderes Ergebnis bekommen als auf Little-Endian Systemen.



  • Wenn du einen Integer aus Byte konstruieren willst, nutze Bitshifts und |.



  • Hat man das vor C11 auch schön dürfen - ich mein einen anderen als den zuletzt geschriebenen union -Member lesen?



  • Es ist nicht notwendig jemals ein union so zu missbrauchen. Löse das eigentliche Problem anstatt Rechtfertigungen für eine "clevere" Lösung zu suchen. Der nächste Leser des Codes wird es dir danken.

    Swordfish schrieb:

    Hat man das vor C11 auch schön dürfen - ich mein einen anderen als den zuletzt geschriebenen union -Member lesen?

    Wo steht, dass das seit C11 nicht mehr undefiniertes Verhalten hat?



  • TyRoXx schrieb:

    Swordfish schrieb:

    Hat man das vor C11 auch schön dürfen - ich mein einen anderen als den zuletzt geschriebenen union -Member lesen?

    Wo steht, dass das seit C11 nicht mehr undefiniertes Verhalten hat?

    Ich hab keinen C-Standard, aber laut diversen Stackoverflow-Antworten ist das in C99 und C11 durchaus erlaubt.



  • TyRoXx schrieb:

    Swordfish schrieb:

    Hat man das vor C11 auch schön dürfen - ich mein einen anderen als den zuletzt geschriebenen union -Member lesen?

    Wo steht, dass das seit C11 nicht mehr undefiniertes Verhalten hat?

    n1570 § 6.5.2.3/3 footnote 95 schrieb:

    If the member used to read the contents of a union object is not the same as the member last used to store a value in the object, the appropriate part of the object representation of the value is reinterpreted as an object representation in the new type as described in 6.2.6 (a process sometimes called ‘‘type punning’’). This might be a trap representation.


Log in to reply