У меня есть небольшой фрагмент кода, как показано ниже:
char global=100;
void main()
{
char p = NULL;
printf("%p\n", &p);
printf("%p\n", &global);
}
Однажды после компиляции и создания двоичного исполняемого образа при каждом выполнении одного и того же двоичного исполняемого файла я вижу разные адреса виртуальной памяти для локальной переменной p
.
Однако адрес виртуальной памяти глобальной переменной global
остается прежней. Я понимаю схему памяти C; и я ожидаю одно и то же место в памяти для данной переменной при каждом выполнении с использованием одного и того же двоичного изображения.
В чем может быть причина того, что виртуальный адрес, присвоенный локальной переменной, отличается во время выполнения?
Функция всего одна, и нет возможности изменить порядок выполнения функции и тем самым изменить структуру памяти стека.
Результат запуска этой программы 4 раза:
0x7fff181b4b2f
0x601034
0x7ffe34abd62f
0x601034
0x7ffe2813b98f
0x601034
0x7fffcef6b52f
0x601034
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
- person Francesco Laurita   schedule 21.01.2018