Почему программа каждый раз занимает различные области памяти?
Потому что современные ОС делают это намеренно, чтобы затруднить эксплуатацию уязвимостей в ПО. Это называется ASLR: address space layout randomization. Обычно есть способ отключить ASLR глобально либо для отлаживаемых программ, чтобы добиться воспроизводимости результатов.
Так, например, в linux это делается глобально с помощью файла
/proc/sys/kernel/randomize_va_space
либо командой
setarch -R
для одного конкретного процесса. Отладчик gdb по умолчанию отключает ASLR для отлаживаемых программ.