In un programma C Ho una structQuando è legale digitare type-pun usando un puntatore a puntatore in C?
typedef struct {
void *payload; // opaque, real type known to callbacks
... some stuff ...
} MiddleMan;
di creare qualche parvenza di tipo di sicurezza che potrei creare getter e setter
CbData *get_cb_data(const MiddleMan *mm){ return mm->payload; }
void set_cb_data(MiddleMan *mm, CbData *cbd){ mm->payload = cbd; }
Oppure posso provare a farlo con una sola, puntatore di accesso basata su
CbData **cb_data(MiddleMan *mm){return (CbData**)&mm->payload;}
ora la seconda soluzione sembra dodgier rispetto alla prima, e limita inoltre agli utenti di non-const mm
anche se o voglio solo leggere. Ma la mia domanda è se è addirittura legale C?
Sono abbastanza sicuro che è possibile farla franca su qualsiasi architettura in cui lo void*
è della stessa dimensione del formato & come CbData*
. Ma qualcuno può dare un chiaro ragionamento sul perché questo sia (o non sia) valido in generale?
Questo è legale in C. 'void *' e 'CbData *' sono sempre della stessa dimensione - entrambi sono di tipo puntatore. Scusa ma non capisco perché ci sia una domanda sulla validità di questa implementazione di "**" che hai scritto sopra. –
Su alcune architetture bizzarre, la dimensione dei puntatori varia a seconda di cosa indicano. 'void *' dovrebbe essere abbastanza grande da coprire tutte le possibilità, ma 'CbData *' può essere più piccolo, a seconda di cosa sia effettivamente 'CbData'. –
puoi per favore dare qualche esempio di quelle strane architetture? Davvero curioso –