Как узнать адрес структуры, зная адрес одной из переменных внутри? С++, 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 - указывают на эти элементы, и потом из них вычисляется адрес структуры.