Jika Anda menggunakan Windows, alasannya adalah struktur PE .
heap
Variabel Anda disimpan di .data
bagian file dan alamatnya dihitung berdasarkan awal bagian ini. Setiap bagian dimuat dalam alamat secara independen, tetapi alamat awalnya adalah kelipatan dari ukuran halaman. Karena Anda tidak memiliki variabel lain, alamatnya mungkin mulai dari .data
bagian, jadi alamatnya akan lebih dari satu ukuran chunk.
Sebagai contoh, ini adalah tabel dari Windows versi dikompilasi dari kode Anda:
The .text
seksi yang kode dikompilasi Anda dan .data
berisi Anda heap
variabel. Ketika PE Anda dimuat ke dalam memori, bagian dimuat di alamat yang berbeda dan yang dikembalikan oleh VirtualAlloc()
dan akan menjadi beberapa ukuran halaman. Tetapi alamat masing-masing variabel relatif terhadap awal bagian yang sekarang menjadi ukuran halaman. Jadi, Anda akan selalu melihat nomor tetap pada digit yang lebih rendah. Karena alamat relatif heap
dari awal bagian didasarkan pada kompiler, opsi kompilasi, dll. Anda akan melihat nomor berbeda dari kode yang sama tetapi kompiler berbeda, tetapi setiap kali apa yang akan dicetak diperbaiki.
Ketika saya mengkompilasi kode, saya perhatikan heap
ditempatkan pada 0x8B0
byte setelah memulai .data
bagian. Jadi setiap kali saya menjalankan kode ini, alamat saya berakhir 0x8B0
.