Это дает вам смещение в байтах поля b
внутри hi
struct
((struct hi *)0)
- указатель на hi
структуру, начиная с адреса 0
.
(((struct hi *)0)->b)
- это поле b
вышеуказанной структуры.
& (((struct hi *)0)->b)
- это адрес вышеуказанного поля.Поскольку структура hi
расположена по адресу 0
, это смещение b
в структуре.
(unsigned int) & (((struct hi *)0)->b)
является преобразованием этого значения из типа адреса в unsigned int
, поэтомучто его можно использовать как число.
Вы на самом деле не разыменовываете указатель NULL
.Вы просто делаете арифметику указателей.
Доступ к (((struct hi *)0)->b)
вызовет ошибку сегментации, потому что вы пытаетесь получить доступ к запрещенной ячейке памяти.
Использование & (((struct hi *)0)->b)
делаетне дает вам ошибки сегментации, потому что вы берете только адрес этой запрещенной ячейки памяти, но вы не пытаетесь получить доступ к указанному местоположению.