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