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