Où vit chaque variable
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 8 — Mémoire, fichiers et entrées-sorties
Énoncé
Pour chacune des six entités de ce programme, dire dans quelle zone elle réside et quelle est sa durée de vie.
int globale = 1;
void ou_suis_je(int parametre) {
int locale = 3;
int* du_tas = malloc(sizeof(int));
/* ... */
free(du_tas);
}Corrigé
| Entité | Zone | Durée de vie | Adresse mesurée |
|---|---|---|---|
| `ou_suis_je` | code | tout le programme | `0x102f53dd4` |
| `globale` | globales | tout le programme | `0x102f58000` |
| `du_tas` (le bloc pointé) | tas | du `malloc` au `free` | `0x10365dbd0` |
| `parametre` | pile | l'appel | `0x16ceae5fc` |
| `locale` | pile | l'appel | `0x16ceae5f8` |
| `du_tas` (la variable) | pile | l'appel | --- |
Les adresses de la dernière colonne ont été mesurées par un printf("%p", ...) sur chacune. Trois choses s'y lisent, et aucune n'est un détail :
- Le code, les globales et le tas sont dans la même famille d'adresses (
0x1...), tandis que la pile est très loin (0x16c...). Les deux zones croissent l'une vers l'autre, comme le montre la figure du début de ce chapitre — c'est ce qui leur laisse le maximum de place. localeest à...5f8etparametreà...5fc: quatre octets d'écart, et la locale est plus bas. La pile descend.- La distinction décisive porte sur
du_tas: la variable est sur la pile et meurt au retour ; le bloc qu'elle désigne est sur le tas et survit tant qu'on ne l'a pas libéré. C'est exactement pourquoi on peut rendre un pointeur du tas et jamais un pointeur de pile.
Ces adresses changent à chaque exécution : le système décale les zones au hasard (ASLR) pour compliquer les attaques. Ce qui ne change pas, ce sont les écarts relatifs et l'appartenance aux zones.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.