Consider the following code:
#include <inttypes.h>
struct test {
    int a;
    long b;
};
int main(void){
    intptr_t ptr = (intptr_t) &(((struct test *)NULL)->b);
    printf("%"PRIiPTR"\n", ptr); //prints 8
    //...
}
I've been using this sort of construction for pretty long time to determine offset of struct member, but now questioned if this construction a well defined in terms of the Standard standpoint.
The thing that's not clear to me is why is it legitimate to perform indirection on a NULL pointer with later taking address?
 
    