In einem C-Programm habe ich eine StrukturWann ist es legal, mit einem Zeiger auf einen Zeiger in C zu tippen?
typedef struct {
void *payload; // opaque, real type known to callbacks
... some stuff ...
} MiddleMan;
Um etwas Furnier von Typsicherheit zu schaffen könnte ich
CbData *get_cb_data(const MiddleMan *mm){ return mm->payload; }
void set_cb_data(MiddleMan *mm, CbData *cbd){ mm->payload = cbd; }
Getter und Setter erstellen Oder ich kann versuchen, es mit einem einzigen, Zeiger zu tun -basierte Accessor
CbData **cb_data(MiddleMan *mm){return (CbData**)&mm->payload;}
Nun ist die zweite Lösung sieht dodgier als die erste, und es schränkt auch Benutzer auf nicht-const mm
auch wenn sie o will nur lesen. Aber meine Frage ist, ob es überhaupt legal C ist?
Ich bin mir ziemlich sicher, dass Sie damit auf jeder Architektur, wo void*
ist die gleiche Größe & Format wie CbData*
. Aber kann jemand klar begründen, warum das überhaupt gilt (oder nicht)?
Dies ist legal in C. 'void *' und 'CbData *' haben immer die gleiche Größe - beide sind Zeigertypen. Tut mir leid, aber ich verstehe nicht, warum es eine Frage zur Gültigkeit dieser '**' Implementierung gibt, die Sie oben geschrieben haben. –
Auf einigen seltsamen Architekturen variiert die Größe der Zeiger je nachdem, auf was sie zeigen. 'void *' sollte groß genug sein, um alle Möglichkeiten abzudecken, aber 'CbData *' kann kleiner sein, abhängig davon, was 'CbData' eigentlich ist. –
können Sie bitte einige Beispiele dieser seltsamen Architekturen geben? Wirklich neugierig. –