Vereinigung für uint32_t und uint8_t [4] undefiniertes Verhalten? [Duplikat]

Diese Frage hat hier bereits eine Antwort:

Zweck von Unions in C und C ++ 14 Antworten

In den Kommentaren vondiese Antwort Es wird gesagt, dass es undefiniertes Verhalten wäre, eine Ganzzahl mit einer Vereinigung wie folgt in ihre Bytes aufzuteilen. Der an dieser Stelle angegebene Code ist ähnlich, aber nicht identisch. Bitte geben Sie einen Hinweis, wenn ich undefinierte verhaltensrelevante Aspekte des Codes geändert habe.

<code>union addr {
 uint8_t addr8[4];
 uint32_t addr32;
};
</code>

Bisher dachte ich, dies wäre ein guter Ansatz, um Dinge wie zu tunaddr = {127, 0, 0, 1}; und bekomme das entsprechendeuint32_t im Gegenzug. (Ich gebe zu, dass dies je nach Endianität meines Systems zu unterschiedlichen Ergebnissen führen kann. Die Frage bleibt jedoch offen.)

Ist das undefiniertes Verhalten? Wenn ja warum? Ich weiß nicht, was das bedeutetWas UB in C ++ ist, ist auf inaktive Gewerkschaftsmitglieder zuzugreifen.)

C99

C99 kommt C ++ 03 in diesem Punkt anscheinend ziemlich nahe.

C ++ 03

In einer Union kann zu jedem Zeitpunkt höchstens eines der Datenmitglieder aktiv sein, dh, der Wert von höchstens einem der Datenmitglieder kann zu jedem Zeitpunkt in einer Union gespeichert werden. C ++ 03, Abschnitt 9.5 (1), Seite 162

jedoch

Wenn eine POD-Union mehrere POD-Strukturen enthält, die eine gemeinsame [...] Anfangssequenz haben, ist es zulässig, die gemeinsame Anfangssequenz eines beliebigen POD-Strukturmitglieds zu überprüfen ibid.Zwei [...] POD-Strukturtypen sind layoutkompatibel, wenn sie die gleiche Anzahl von nicht statischen Datenelementen aufweisen, und entsprechende nicht statische Datenelemente (in Reihenfolge) haben layoutkompatible Typen C ++ 03, Abschnitt 9.2 (14), Seite 157Wenn zwei Typen T1 und T2 vom selben Typ sind, sind T1 und T2 layoutkompatible Typen. C ++ 03, Abschnitt 3.9 (11), Seite 53

Fazit

wieuint8_t[4] unduint32_t sind nicht der gleiche Typ (ich denke, astrikte Aliasing-Sache) (plus beide sind keine POD-Strukturen / Vereinigung) ist das obige in der Tat UB?

C ++ 11

Beachten Sie, dass der Aggregattyp den Vereinigungstyp nicht enthält, da ein Objekt mit Vereinigungstyp jeweils nur ein Element enthalten kann. C ++ 11, Fußnote 46, Seite 42

Antworten auf die Frage(4)

Ihre Antwort auf die Frage