Jak to działa?
Podstawowym równanie tutaj (wszystkie działania arytmetyczne w bajtach) jest
address of struct member s->a == s + byte offset of a
Biorąc pod uwagę rodzaj s
pojedynczy kompilator, a pojedynczy komputer docelowy, że określona offset bajtowy a
— jest to to samo dla każdej struktury typu s.
Masz lewą stronę, a Twój ankieter poprosił Cię o odzyskanie s
. Możesz to zrobić, otrzymując nowe równanie; odjąć offset bajtowy z obu stron:
address of struct member s->a - byte offset of a == s
W problemu, jesteś daną adres s->a
, ale trzeba dowiedzieć się bajt offset. Aby to zrobić, należy użyć oryginalnego równania ponownie z s
zestaw do zera:
address of struct member s->a where s is zero == zero + byte offset of a
== byte offset of a
boczna lewa w C zbudowany jest następująco
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
czynności końcowych:
- Aby uczynić arytmetyczną legalną C, offset bajtowy jest rzutowany na liczbę całkowitą.
- Aby się upewnić, że odejmowanie odbywa się w jednostkach bajtów,
a_ptr
jest rzutowane na char *
.
- Aby dać wynik odpowiedniego typu, różnica jest rzutowana na
struct s *
.
Uzupełnienie: Jak Eli Bendersky zwraca uwagę, należy starać się unikać sytuacji, w których ten kod byłyby konieczne. Zawsze jest lepszy sposób.
Co **czy ty pytasz? –
Przepraszam, miałem pytanie w tytule, ale nie sam post. Naprawiono to teraz. – Steve