Poprosiłem Google o przeprowadzenie badań nad StackOverflow. Moje pytanie brzmi: kiedy wprowadzam funkcję main()
w programie C++ i deklaruję pierwszą zmienną, dlaczego adres tej zmiennej może się różnić w zależności od różnych wykonań? Proszę zobaczyć mój przykładowy program poniżej:Dlaczego adresy zmiennych lokalnych mogą być różne za każdym razem?
#include <iostream>
int main() {
int *a = new int;
int *b = new int;
std::cout << "address: " << a << " " << b << std::endl;
std::cout << "address of locals: " << &a << " " << &b << std::endl;
return 0;
}
Wynik na wykonanie 1:
address: 0xa32010 0xa32030
address of locals: 0x7fff10de2cf0 0x7fff10de2cf8
Wynik na wykonanie 2:
address: 0x1668010 0x1668030
address of locals: 0x7ffc252ccd90 0x7ffc252ccd98
Wynik na wykonanie 3:
address: 0x10e0010 0x10e0030
address of locals: 0x7ffd3d2cf7f0 0x7ffd3d2cf7f8
Jak widać, otrzymuję różne wyniki przy różnych wykonaniach. Pierwszy wiersz danych wyjściowych odpowiadający adresowi przydzielonej pamięci, który powinien się wydarzyć w stercie - jeśli mają one przypisane różne adresy za każdym razem, ma to dla mnie sens. Jednak nawet kiedy drukuję adresy zmiennych lokalnych - odpowiadające drugiej linii - wyniki są nadal różne.
Na pierwszy rzut oka myślałem, że to dlatego, że program drukuje fizyczny adres pamięci, ale ten wpis, Virtual Memory or Physical Memory, obala moją początkową myśl. Czy jest jakiś powód, że biorąc pod uwagę, że realizacja programów jest "taka sama", bez wątków, żadnych danych wejściowych użytkownika itp., Że nadal istnieją alokacje pamięci z różnymi adresami?
środowisku testowym:
- Linux 14.04
- Mac OS X 10,10
Po pierwsze, ASLR prawdopodobnie przyczynia się - czy jest włączony w jądrach w systemach testowych? – fish2000
Tak, to prawie na pewno [ASLR] (https://en.wikipedia.org/wiki/Address_space_layout_randomization) w pracy. –
@ fish2000, z pewnością powinieneś dodać to jako odpowiedź z odrobiną wyjaśnienia. – SergeyA