Почему де-ссылка 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;
}