¿Cómo funciona?
La ecuación fundamental aquí (toda la aritmética en bytes) es
address of struct member s->a == s + byte offset of a
Dado el tipo de s
, un compilador, y una sola máquina de destino, que determina el desplazamiento de a
— byte que es el lo mismo para cada estructura de tipo s.
Se le ha dado el lado izquierdo y su entrevistador le pidió que se recupere s
. Puedes hacer esto obteniendo una nueva ecuación; restar el desplazamiento desde ambos lados de bytes:
address of struct member s->a - byte offset of a == s
En el problema, estás dada la dirección de s->a
, pero hay que averiguar el desplazamiento de bytes. Para ello se utiliza la ecuación original nuevo con s
pusieron a cero:
address of struct member s->a where s is zero == zero + byte offset of a
== byte offset of a
El lado izquierdo en C se construye de la siguiente manera
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
pasos finales:
- Para hacer que la aritmética sea legal C, este desplazamiento de bytes se convierte en un número entero.
- Para asegurarse de que la resta se realiza en unidades de bytes,
a_ptr
se convierte en char *
.
- Para dar el resultado del tipo correcto, la diferencia se convierte en
struct s *
.
Adición: Como Eli Bendersky señala, se debe tratar de evitar situaciones en las que sería necesario este código. Casi siempre hay una mejor manera.
Lo **¿Estás preguntando? –
Lo siento, tenía la pregunta en el título pero no en la publicación en sí. Está arreglado ahora. – Steve