Как узнать адрес структуры, зная адрес одной из переменных внутри? С++, WinAPI

Предположим есть структура вроде такой:

struct Foo {
    int a;
    int b;
    int c;
}

Предположим, что у меня есть адрес переменной одного из экземпляров Foo. Как я могу получить адрес начала этой структуры в памяти процесса? Потыкал WinAPI, но ничего не смог придумать


Ответы (1 шт):

Автор решения: AlexGlebe

Макрос offsetof даёт смещение элемента структуры. Сначала нужно адрес элемента преобразовать на тип, имеющий размер 1 байт. Делаем сначала (char*). Потом отнимаем смещение в байтах и преобразовываем на тип структуры.

#include <stddef.h>
#include <stdio.h>

struct Foo {
    int i;
    char c;
    float f;
};

int  main()       {
  struct Foo foo ;
  int * const pi = & foo .  i ;
  char * const pc = & foo . c ;
  float * const pf = & foo . f ;
  struct Foo * const fi = (struct Foo *)((char*)pi-offsetof(struct Foo,i));
  struct Foo * const fc = (struct Foo *)((char*)pc-offsetof(struct Foo,c));
  struct Foo * const ff = (struct Foo *)((char*)pf-offsetof(struct Foo,f));
  printf("& foo = %p\n",&foo);
  printf("pi = %p\n",pi);
  printf("pc = %p\n",pc);
  printf("pf = %p\n",pf);
  printf("fi = %p\n",fi);
  printf("fc = %p\n",fc);
  printf("ff = %p\n",ff);
}

проверка :

& foo = 0x7ffdf08aef74
pi = 0x7ffdf08aef74
pc = 0x7ffdf08aef78
pf = 0x7ffdf08aef7c
fi = 0x7ffdf08aef74
fc = 0x7ffdf08aef74
ff = 0x7ffdf08aef74

адреса pi,pc,pf - указывают на эти элементы, и потом из них вычисляется адрес структуры.

→ Ссылка