Comment ça marche?
L'équation fondamentale ici (toute l'arithmétique en octets) est
address of struct member s->a == s + byte offset of a
Compte tenu du type de s
, un seul compilateur, et une seule machine cible, ils ont déterminé l'octet de décalage de a
— il est la même pour chaque structure de type s.
Vous avez le côté gauche et votre enquêteur vous a demandé de récupérer s
. Vous pouvez le faire en obtenant une nouvelle équation; soustraire l'octet décalé des deux côtés:
address of struct member s->a - byte offset of a == s
Dans le problème, vous êtes donné l'adresse de s->a
, mais vous devez comprendre l'octet de décalage. Pour ce faire, vous utilisez l'équation d'origine à nouveau avec s
set à zéro:
address of struct member s->a where s is zero == zero + byte offset of a
== byte offset of a
Le côté gauche C est construite comme suit
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
étapes finales:
- Pour rendre l'arithmétique C légale, ce décalage d'octets est converti en entier.
- Pour vous assurer que la soustraction est effectuée en unités d'octets,
a_ptr
est converti en char *
. Pour donner le résultat correct, la différence est portée à .
Addendum: Comme le souligne Eli Bendersky, vous devriez essayer d'éviter les situations où ce code serait nécessaire. Il y a presque toujours un meilleur moyen.
Qu'est-ce que ** ** demandez-vous? –
Désolé, j'ai eu la question dans le titre mais pas dans le message lui-même. C'est corrigé maintenant. – Steve