Нет. Давайте разделим это:
&(((struct name *)NULL)->b);
совпадает с:
struct name * ptr = NULL;
&(ptr->b);
Первая строка, очевидно, действительна и определена корректно.
Во втором line, мы вычисляем адрес поля относительно адреса 0x0
, который также является совершенно законным. Например, у Amiga был указатель на ядро в адресе 0x4
. Таким образом, вы можете использовать такой метод, чтобы вызвать функции ядра.
На самом деле тот же подход используется для макроса C offsetof
( wikipedia ):
#define offsetof(st, m) ((size_t)(&((st *)0)->m))
Таким образом, путаница здесь вращается вокруг того, что указатели NULL страшны. Но из компилятора и стандартной точки зрения выражение является законным в C (C ++ - это другой зверь, поскольку вы можете перегрузить оператор &
).