Nếu bạn đang sử dụng Windows, lý do là cấu trúc PE .
heapBiến của bạn được lưu trữ trong .dataphần của tệp và địa chỉ của nó được tính dựa trên phần bắt đầu của phần này. Mỗi phần được tải trong một địa chỉ một cách độc lập, nhưng địa chỉ bắt đầu của nó là nhiều kích thước trang. Vì bạn không có biến nào khác, nên địa chỉ của nó có thể là phần bắt đầu của .dataphần, vì vậy địa chỉ của nó sẽ có nhiều kích thước khối.
Ví dụ: đây là bảng của phiên bản Windows đã biên dịch mã của bạn:
Phần .textnày là mã được biên dịch của bạn và .datachứa heapbiến của bạn . Khi PE của bạn được tải vào bộ nhớ, các phần được tải ở các địa chỉ khác nhau và được trả về bởi VirtualAlloc()và sẽ có nhiều kích thước trang. Nhưng địa chỉ của từng biến có liên quan đến phần bắt đầu của phần hiện là kích thước trang. Vì vậy, bạn sẽ luôn thấy một số cố định trên các chữ số thấp hơn. Vì địa chỉ tương đối heaptừ đầu phần dựa trên trình biên dịch, tùy chọn biên dịch, v.v., bạn sẽ thấy số khác nhau từ cùng một mã nhưng trình biên dịch khác nhau, nhưng mỗi lần in sẽ được sửa.
Khi tôi biên dịch mã, tôi nhận thấy heapđược đặt trên 0x8B0byte sau khi bắt đầu .dataphần. Vì vậy, mỗi khi tôi chạy mã này, địa chỉ của tôi sẽ kết thúc 0x8B0.