Nếu bạn đang sử dụng Windows, lý do là cấu trúc PE .
heap
Biến của bạn được lưu trữ trong .data
phầ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 .data
phầ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 .text
này là mã được biên dịch của bạn và .data
chứa heap
biế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 heap
từ đầ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 0x8B0
byte sau khi bắt đầu .data
phầ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
.