Hallo zusammen,
ist es möglich, über einen Zeiger auf ein struct benannte Werte zu
hinterlegen? Sprich: Ich will die GNU-Erweiterung nutzen, in einem
Struct die Elemente per Namen zuzuweisen (d.h. ein anonymes Struct mit
nur den benannten Elementen besetzt zu erzeugen und einem anderen Struct
zuweisen).
Vielleicht läßt es sich mit Quelltext besser erklären:
1 | typedef struct
|
2 | {
|
3 | int a;
|
4 | int b;
|
5 | } S_t;
|
6 |
|
7 |
|
8 | void foo()
|
9 | {
|
10 | S_t a = {.a = 1, .b = 0};
|
11 | buffer int[2];
|
12 | S_t *pb = (S_t *) &buffer[0];
|
13 |
|
14 | // Das will nicht:
|
15 | *(pb) = {.a = 1, .b = 0};
|
16 |
|
17 | // Das ist kein Problem:
|
18 | *(pb) = a;
|
19 | }
|
Ja - das ist heftiges type punning, hat aber im Kontext (auf einem
kleinen µC einen einzelnen Puffer für viele I2C-Daten mit vielen
Bitfields nutzen) einen Sinn.
Das gleiche Spiel auch bei einem union:
1 | void bar()
|
2 | {
|
3 | union
|
4 | {
|
5 | S_t S;
|
6 | } Buf;
|
7 |
|
8 | // Das will nicht:
|
9 | Buf.S = {.a = 1, .b = 0};
|
10 |
|
11 | // Jetzt zwinge ich Dich halt:
|
12 | Buf.S = (S_t) {.a = 1, .b = 0};
|
13 | }
|
Also die Frage: Was mache ich falsch, wenn ich einem struct über einen
Zeiger ein anonymes struct zuweisen will?
Viele Grüße
W.T.