Warum verursacht die NULL-De-Referenz in diesem C-Snippet kein undefiniertes Verhalten

Ich bin auf einen Code gestoßen, in dem NULL in einen Strukturzeigertyp @ geschrieben is(foo *) 0 und mit diesem Zeiger ein Mitglied de-referenzieren((foo *)0)->m und unter Verwendung der Adresse dieses&(((foo *)0)->m)) und gib Casting it to Integer ein, um den Speicherindex dieses Members in der Struktur abzurufen.((unsigned int)(&(((foo *)0)->m))).

Meines Wissens nach sollte eine NULL-Zeiger-Dereferenzierung immer zu einem Segmentierungsfehler in C führen. Ich verstehe jedoch nicht, wie ein NULL-Zeiger auf diese Weise de-referenziert werden kann und trotzdem keinen Segmentierungsfehler verursacht.

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage