Linuksa stddef.h definiuje offsetof()
jak:Dlaczego odjąć pusty wskaźnik w offsetof()?
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
natomiast artykuł na offsetof()
(http://en.wikipedia.org/wiki/Offsetof) określa ją jako:
#define offsetof(st, m) \
((size_t) ((char *)&((st *)(0))->m - (char *)0))
Dlaczego odjąć (char *)0
w wersji Wikipedii? Czy jest jakikolwiek przypadek, w którym miałoby to znaczenie?
Nie powinieneś używać/badać kodu, który może wywoływać niezdefiniowane zachowanie, jak wyżej. Implementacja może wykorzystywać takie skandaliczne hacki, ponieważ wie, jakie rodzaje niezdefiniowanych zachowań potajemnie działają. Ale to, co "potajemnie działa", nie jest całkowicie przenośne. – CTMacUser