Пожалуйста, обратитесь к программе ниже:
#include<stdio.h>
int main()
{
int a, b;
printf("address of main =%p\n", main);
a=3;
printf("Address of 'a' =%p\n", &a);
return 0;
}
Я скомпилировал вышеуказанную программу, используя gcc
, а затем запустил двоичный файл. Я получаю следующий вывод:
[root@localhost gdb]# ./a.out
address of main =0x400536
Address of 'a' =0x7ffc4802cbdc
[root@localhost gdb]# ./a.out
address of main =0x400536
Address of 'a' =0x7ffe2bdcd66c
[root@localhost gdb]#
Тот же исходный код скомпилирован с –m32
, теперь я получаю вывод:
[root@localhost gdb]# ./a.out
address of main =0x804841b
Address of 'a' =0xffa6b29c
[root@localhost gdb]# ./a.out
address of main =0x804841b
Address of 'a' =0xff9b808c
Вот мой вопрос: почему изменился адрес диапазона переменных a
при запуске 64- и 32-битного приложения в 64-битном ядре? Адрес функции main
остается неизменным. Почему адреса переменных a
меняются при каждом запуске? И где хранится адрес переменной a
?