¿Por qué la desreferencia NULL en este fragmento de C no causa un comportamiento indefinido?

Me encontré con un código en el que NULL está encasillado en un tipo de puntero de estructura(foo *) 0, y con ese puntero desreferenciando a un miembro((foo *)0)->my usando la dirección de ese&(((foo *)0)->m)) y escriba convertirlo en entero para obtener el índice de memoria de ese miembro en la estructura.((unsigned int)(&(((foo *)0)->m))).

Que yo sepa, la desreferencia de puntero NULL siempre debe dar como resultado una falla de segmentación en C. Pero no entiendo cómo se puede desreferenciar el puntero NULL de esta manera y aún así no dar como resultado una falla de segmentación.

#include <stdio.h>
#define  MACRO(m) ((unsigned int)(&(((foo *)0)->m)))

typedef struct
{
int a;
int b;
int c;
int d;
}foo;

int main(void) {
    printf("\n  %d  ", MACRO(c));
    return 0;
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta