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