Как это работает?
Основное уравнение здесь (все арифметические в байтах):
address of struct member s->a == s + byte offset of a
Учитывая тип s
, один компилятор и один целевой компьютер, они определили смещение в байтах a
- оно одинаково для каждой структуры типа s.
Вы получили левую сторону, и ваш интервьюер попросил вас восстановить s
. Вы можете сделать это, получив новое уравнение; вычтите смещение байта с обеих сторон:
address of struct member s->a - byte offset of a == s
В задаче вы дали адрес s->a
, но вам нужно выяснить смещение байта. Для этого вы используете исходное уравнение снова с s
равным нулю:
address of struct member s->a where s is zero == zero + byte offset of a
== byte offset of a
Левая сторона в C построена следующим образом
struct pointer s where s is zero (struct s *)0
struct member s->a where s is zero ((struct s*)0)->a
address of s->a where s is zero &((struct s*)0)->a
Заключительные шаги:
- Чтобы сделать арифметику допустимой C, это смещение байта приводится к целому числу.
- Чтобы убедиться, что вычитание выполняется в байтах,
a_ptr
приведено к char *
.
- Для получения правильного результата разность приведена к
struct s *
.
Приложение: Как отмечает Эли Бендерский, вам следует избегать ситуаций, когда этот код был бы необходим. Почти всегда есть лучший способ.