Adloun

Portée et durée de vie ne sont pas la même chose

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 8 — Mémoire, fichiers et entrées-sorties

Énoncé

Qu'affiche ce programme ? Combien de variables nommées n existe-t-il ?


int n = 100;                 /* globale */

void compteur(void) {
    int local = 0;
    static int persistant = 0;
    local = local + 1;
    persistant = persistant + 1;
    printf("local = %d, persistant = %d\n", local, persistant);
}

int main(void) {
    int n = 1;
    printf("dans main, n = %d\n", n);
    { int n = 2; printf("dans le bloc, n = %d\n", n); }
    printf("apres le bloc, n = %d\n", n);
    for (int i = 0; i < 3; i = i + 1) { compteur(); }
    return 0;
}

Corrigé

La sortie mesurée est :


dans main, n = 1
dans le bloc, n = 2
apres le bloc, n = 1
local = 1, persistant = 1
local = 1, persistant = 2
local = 1, persistant = 3

Il existe trois variables nommées n, et elles coexistent : la globale à , la locale de main à , celle du bloc à . Aucune n'écrase l'autre — le bloc masque le nom, il ne modifie pas la case. À la sortie du bloc, la locale de main vaut toujours , et la globale vaut toujours : elle est simplement devenue inaccessible par son nom dès la ligne int n = 1;.

C'est la définition même de la portée : elle est syntaxique. Elle se lit sur le texte du programme, en fermant les accolades du regard, sans rien exécuter.

Les trois dernières lignes séparent les deux notions. local et persistant ont la même portée — le corps de compteur — et des durées de vie opposées : local naît et meurt à chaque appel, donc revaut trois fois ; persistant est allouée une fois pour toutes dans la zone des globales et compte .

Le tableau à retenir :

PortéeDurée de vie
`int n` globaletout le fichier, sauf masquagele programme
`int n` localele blocl'appel
`static int persistant`le blocle programme
bloc `malloc`(aucune : il n'a pas de nom)jusqu'au `free`

La ligne static est celle qui prouve que les deux colonnes sont indépendantes.

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.