Si está utilizando Windows, la razón es la estructura PE .
Su heapvariable se almacena en la .datasecció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 .datasecció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 .textsección es donde su código compilado es y .datacontiene su heapvariable. 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 heapdesde 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 heapse coloca en 0x8B0bytes después del inicio de la .datasección. Entonces, cada vez que ejecuto este código, mi dirección termina en 0x8B0.