Encontrar la dirección de la estructura sabiendo la dirección de uno de sus miembros en C

1

Esto suena como un poco exagerado, pero ¿existe alguna posibilidad de encontrar la dirección de una estructura, si se conoce la dirección de uno de sus miembros? La estructura en sí misma contiene diferentes tipos de datos, y está alineada con 2 bytes. Estoy trabajando en un objetivo incrustado, con el compilador DIAB.

Aquí está la aplicación final. Hay un dispositivo externo con acceso directo de R / W a la memoria RAM. Si este dispositivo modifica una ubicación de memoria que está dentro de una estructura, necesito saber qué estructura era (o su dirección de inicio) para que el procesamiento se realice más adelante.

¡Gracias!

    
pregunta Soju T Varghese

2 respuestas

3

Hay un viejo truco en C que te permite #define una macro que hace eso. El truco va:

  1. Diga que su tipo struct se llama struc_t . Cree un puntero a uno de estos y señálelo a cualquier dirección:

    struc_t *base_pointer = (struc_t*) 0;
    
  2. Di el miembro cuya dirección sabes que es struc_t.member ; entonces solo obtienes la dirección de eso:

    char *elem_pointer = &(base_pointer->member);
    
  3. Luego, obtienes el desplazamiento mediante una operación matemática funky llamada resta:

    size_t offset = (elem_pointer-base_pointer);
    
  4. Ahora, puedes restar offset de la dirección de tu elemento. Hecho!

Si la cadena de herramientas de su procesador está a mitad de camino decente, admitirá la macro offsetof . (De hecho, eso es C89, vea man offsetoff ).

    
respondido por el Marcus Müller
0

De otra pregunta en stackoverflow se hace evidente que sí, puedes encontrar el Dirección de una estructura si conoce a uno de sus miembros.

Entonces, si conoce la dirección de inicio de la estructura de su estructura y conoce la cantidad de bytes por estructura. Luego puedes usar la división simple para descubrir qué estructura es.

Ejemplo

Todo está en la base 10

Digamos que tenemos una matriz que comienza en la dirección 350 y encontramos un miembro de una estructura desconocida en la dirección 482. Digamos que cada estructura contiene 7 bytes de memoria.

Luego, la dirección de 482 es parte del número de estructura \ $ \ frac {482-350} {7} \ approx 18.85 \ rightarrow 18 \ $ .
Todo se redondea automáticamente si solo usas números enteros en todas partes.

Aquí vine con el número 7 para el número de bytes por estructura, en su caso, debe usar el comando sizeof .

Editar

Si necesita recurrir a este tipo de soluciones, entonces algo está muy mal con su código. O tu control allí de. Creo que he resuelto un problema XY , uno de mis mayores temores ha Hacerse realidad.

No veo ninguna realidad donde esta solución es la correcta, por lo que esta solución es claramente el último recurso de algún tipo. Si es debido a limitaciones reales, o la limitación de su imaginación, esa es la pregunta.

    
respondido por el Harry Svensson

Lea otras preguntas en las etiquetas