W programie C Mam structKiedy można legalnie pisać przy użyciu wskaźnika do wskaźnika w C?
typedef struct {
void *payload; // opaque, real type known to callbacks
... some stuff ...
} MiddleMan;
Aby stworzyć pewne pozory typu bezpieczeństwa mógłbym stworzyć pobierające i ustawiające
CbData *get_cb_data(const MiddleMan *mm){ return mm->payload; }
void set_cb_data(MiddleMan *mm, CbData *cbd){ mm->payload = cbd; }
Albo mogę spróbować zrobić to z jednym, wskaźnik -na accessor
CbData **cb_data(MiddleMan *mm){return (CbData**)&mm->payload;}
obecnie drugim rozwiązania wygląda dodgier niż pierwszy, a także ogranicza użytkowników do const mm
nawet jeśli oni o raczej chcę czytać. Ale moje pytanie brzmi, czy to nawet legalne C?
Jestem prawie pewien, że możesz sobie z tym poradzić w każdej architekturze, w której void*
ma ten sam rozmiar co format & jako CbData*
. Ale czy ktoś może jasno uzasadnić, dlaczego jest on (lub nie jest) w ogóle ważny?
Jest to legalne w C. 'void *', a 'CbData *' są zawsze tego samego rozmiaru - oba są typu wskaźnika. Przepraszam, ale nie rozumiem, dlaczego istnieje pytanie dotyczące ważności tej "**" wersji, którą napisałeś powyżej. –
W niektórych dziwnych architekturach rozmiar wskaźników zmienia się w zależności od tego, co wskazują. 'void *' powinno być wystarczająco duże, aby pokryć wszystkie możliwości, ale 'CbData *' może być mniejsze, w zależności od tego, czym jest 'CbData'. –
czy możesz podać przykłady tych dziwnych architektur? Naprawdę ciekawy. –