Por que a des-referência NULL neste trecho C não causa comportamento indefinido
Me deparei com um pedaço de código onde NULL é tipecast para um tipo de ponteiro de estrutura(foo *) 0
e, com esse ponteiro, de-referenciar um membro((foo *)0)->m
e usando o endereço desse&(((foo *)0)->m))
e digite convertê-lo em número inteiro para obter o índice de memória desse membro na estrutura.((unsigned int)(&(((foo *)0)->m)))
.
Que eu saiba, a desreferência de ponteiro NULL sempre deve resultar em uma falha de segmentação em C. Mas não entendo como o ponteiro NULL pode ser des-referenciado dessa maneira e ainda não resultar em uma falha de segmentação.
#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;
}