Si está utilizando Windows, la razón es la estructura PE .
Su heap
variable se almacena en la .data
sección del archivo y su dirección se calcula en función del inicio de esta sección. Cada sección se carga en una dirección de forma independiente, pero su dirección inicial es múltiple del tamaño de la página. Debido a que no tiene otras variables, es probable que su dirección sea el inicio de la .data
sección, por lo que su dirección será múltiplo del tamaño del fragmento.
Por ejemplo, esta es la tabla de la versión compilada de Windows de su código:
La .text
sección es donde su código compilado es y .data
contiene su heap
variable. Cuando su PE se carga en la memoria, las secciones se cargan en una dirección diferente y la devuelve VirtualAlloc()
y será múltiplo del tamaño de la página. Pero la dirección de cada variable es relativa al inicio de la sección que ahora es un tamaño de página. Por lo tanto, siempre verá un número fijo en los dígitos más bajos. Dado que la dirección relativa de heap
desde el inicio de la sección se basa en el compilador, las opciones de compilación, etc., verá un número diferente del mismo código, pero diferentes compiladores, pero cada vez que se imprima se corrige.
Cuando compilo código, noté que heap
se coloca en 0x8B0
bytes después del inicio de la .data
sección. Entonces, cada vez que ejecuto este código, mi dirección termina en 0x8B0
.