Вы не можете.
Даже не гарантируется, что адрес переменных будет одинаковым при многократном запуске программы (см. Рандомизация макета адресного пространства ), поэтому нет способа предсказать адрес статически.
Даже если мы знали, что стек всегда начинался с фиксированного адреса, вполне нормально, чтобы одна и та же переменная имела разный адрес во время разных вызовов функции. Возьмем для примера:
#include <stdio.h>
void f() {
int x;
printf("The address of x is: %p\n", &x);
}
void g() {
int y;
f();
}
int main() {
f();
g();
return 0;
}
Если вы скомпилируете это без оптимизаций (что приведет к удалению определения y
), вы получите два разных адреса для x
. Поэтому, глядя на определение f
, мы не можем предсказать адрес его переменных, потому что он даже не будет одинаковым при одном и том же запуске программы.
Кроме того, ваша фаза не будет знать, какие оптимизации будут выполняться после нее, какие переменные будут храниться в регистрах или какой регистр будет помещен в стековую память - все это повлияет на адреса.