Почему де-ссылка NULL в этом фрагменте C не вызывает неопределенного поведения

Я наткнулся на фрагмент кода, где NULL является типом, приведенным к типу указателя на структуру(foo *) 0и с этим указателем разыменовывает член((foo *)0)->mи используя адрес этого&(((foo *)0)->m)) и введите приведение его к целому числу, чтобы получить индекс памяти этого члена в структуре.((unsigned int)(&(((foo *)0)->m))).

Насколько мне известно, разыменование NULL-указателя должно всегда приводить к ошибке сегментации в C. Но я не понимаю, как можно разыменовать указатель NULL, как это, и все же не приводить к ошибке сегментации.

#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;
}

Ответы на вопрос(1)

Ваш ответ на вопрос