Если вы используете Windows, причина в структуре PE .
Ваша heap
переменная хранится в .data
разделе файла, и ее адрес рассчитывается на основании начала этого раздела. Каждый раздел загружается по адресу независимо, но его начальный адрес кратен размеру страницы. Поскольку у вас нет других переменных, его адрес, вероятно, является началом .data
раздела, поэтому его адрес будет кратен размеру куска.
Например, это таблица скомпилированной версии Windows , ваш код:
раздел были ваш скомпилированный код и содержит ваш переменный. Когда ваш PE загружен в память, разделы загружаются по другому адресу, который возвращается и будет кратным размеру страницы. Но адрес каждой переменной относительно начала раздела, который теперь является размером страницы. Таким образом, вы всегда будете видеть фиксированное число в младших разрядах. Поскольку относительный адрес в начале раздела основан на компиляторе, опциях компиляции и т. Д., Вы увидите разные числа в одном и том же коде, но разные компиляторы, но каждый раз, когда будет напечатано, исправлено..text
.data
heap
VirtualAlloc()
heap
Когда я компилировал код, я заметил, что heap
он помещается в 0x8B0
байты после начала .data
раздела. Поэтому каждый раз, когда я запускаю этот код, мой адрес заканчивается 0x8B0
.