В ANSI C значение offset определяется как указано ниже.
#define offsetof(st, m) \
((size_t) ( (char *)&((st *)(0))->m - (char *)0 ))
Почему это не приведет к ошибке сегментации, так как мы разыскиваем указатель NULL? Или это какой-то взлом компилятора, где он видит, что выведен только адрес смещения, поэтому он статически вычисляет адрес без фактического разыменования его? Также этот переносимый код?