@SoIntMan
Nur (A) ist MISRA-Konform, weil B+C Standardinkonform sind, weil sie UB sind. (Gut, C erst wirklich UB bei Dereferenzierung).
C ist keine Grauzone, sondern klar geregelt - ist UB; nur du selbst ignorierst das, indem du den Zeiger castest und damit dem Compiler signalisierst, ich weiß es besser als du, was nicht der Fall ist.
Die union ist Quark, sinnfrei und fehleranfällig. Ebenso Common.
typedef struct
{
char type;
uint16_t P1;
uint16_t P2;
uint16_t res;
} Line_t, Arc_t;
int main ()
{
Line_t lines[10] = { 0 };
Arc_t arcs[10] = { 0 };
arcs[1] = lines[2];
lines[3] = arcs[5]; /* usw */
memcpy (lines, arcs, 10 * sizeof *lines);
}
Hier ist alles standardkonform, und damit ohne UB.
https://onlinegdb.com/PgEqGHJzV
Bei struct Definitionen solltest du immer von größeren zu kleineren Elementen sortieren, also nie mit char anfangen, wegen der Paddingbytes.
In Rust ist das anders, dort wird automatisch die Speicheranordnung der Elemente optimiert, es sei denn, du verbietest es explizit.