J'ai demandé à Google et fait des recherches sur StackOverflow. Ma question est que quand j'entre la fonction main()
dans un programme C++ et déclare la toute première variable, pourquoi est-ce que l'adresse de cette variable peut varier selon différentes exécutions? S'il vous plaît voir mon exemple programme ci-dessous:Pourquoi les adresses des variables locales peuvent-elles être différentes à chaque fois?
#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;
}
Résultat sur l'exécution 1:
address: 0xa32010 0xa32030
address of locals: 0x7fff10de2cf0 0x7fff10de2cf8
Résultat sur l'exécution 2:
address: 0x1668010 0x1668030
address of locals: 0x7ffc252ccd90 0x7ffc252ccd98
Résultat sur l'exécution 3:
address: 0x10e0010 0x10e0030
address of locals: 0x7ffd3d2cf7f0 0x7ffd3d2cf7f8
Comme vous pouvez le voir, j'obtiens des résultats différents sur différentes exécutions. La première ligne de la sortie correspondant à l'adresse de la mémoire allouée, qui devrait arriver dans le tas - si on leur attribue des adresses différentes à chaque fois, cela me semble logique. Cependant, même lorsque j'imprime les adresses de variables locales - correspondant à la deuxième ligne - les résultats sont toujours différents. À première vue, je pensais que c'était parce que le programme imprimait une adresse de mémoire physique, mais ce message, Virtual Memory or Physical Memory, réfute ma pensée initiale. Y a-t-il une raison quelconque, étant donné que l'exécution des programmes est "identique", sans threading, sans entrée d'utilisateur, etc., qu'il existe toujours des allocations de mémoire avec des adresses différentes?
environnement Test:
- Linux 14,04
- Mac OS X 10,10
Pour un, ASLR contribue probablement - est-il activé dans les noyaux sur vos systèmes de test? – fish2000
Oui, c'est presque certainement [ASLR] (https://en.wikipedia.org/wiki/Address_space_layout_randomization) au travail. –
@ fish2000, vous devriez certainement ajouter ceci comme une réponse avec un peu d'explication. – SergeyA