Что такое динамический SQL?

Нет. Давайте разделим это:

&(((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 ++ - это другой зверь, поскольку вы можете перегрузить оператор &).

32
задан Community 23 May 2017 в 12:32
поделиться