Durée de vie

Une variable a une durée de vie qui dépend de l’endroit où elle est définie et de sa classe de stockage .

Une variable définie en dehors d’une fonction a une durée de vie qui commence au démarrage du programme , avant l’appel à la fonction main() et qui se termine à l’arrêt du programme.

Il en est de même pour une variable définie avec la classe de stockage static.

Une variable définie comme paramètre de fonction est crée à chaque appel à cette fonction et disparait lorsque la fonction s’acomplit.

Jusqu’au C99 les variables internes aux fonctions devaient être définies en tête de fonction, avant toute instruction et avaient une durée de vie similaire aux paramètres de la fonction.

Depuis le C99 on peut définir des variables de bloc au sein de paires d’accolades. Dans ce cas la variable apparaît à la déclaration de celle-ci et disparait lorsque le bloc est entièrement exécuté.

Depuis le C99 l’instruction for autorise de créer une variable dans la partie d’initialisation des variables, cette variable existe en dehors du bloc ou de l’instruction contrôlé par l’instruction for et disparait lorsque l’instruction for se termine.


int a = 12;
int c = 24;

int toto(int a) {
    // ici "a" occulte la valeur globale.


    int b; 
    // disparait 
    // à la fin de la fonction

    {
        int a;
        // occulte le paramètre 
        // de fonction, puis disparait 
    }

    for (int a = 0; a < 10; a++);
    // ne fait rien, 10 fois.
    // n'affecte pas le paramètre de fonction

    for (int a = 0; a < 10; a++) {
        int a = 12; 
        // n'influe pas sur la variable
        // supérieure, cette boucle
        // s'exécute 10 fois
        printf("%d\n", a);
        // affiche "12", 10 fois.
    }

    c = 42;
    // contrairement à "a" qui est occultée,
    // la variable "c" ne l'est
    // pas et peut donc y accéder
    // en lecture et en écriture.

    return a; 
    // la valeur du paramètre de fonction
    // c'est à dire 42

}

int main() {
    toto(42);
}

Une variable de portée inférieure peut occulter une variable de portée supérieure : dans ce cas la valeur de portée supérieure n’est plus accessible tant que la variable inférieure est à portée d’exécution (c’est à dire « vivante »), et modifier la variable de portée inférieure n’affecte en rien la variable supérieure.

Dans l’exemple ci dessus, en déclarant une variable de nom « a » dans la fonction ayant le même nom que la variable de portée globale, on ne peut plus au sein de la fonction ni lire ni écrire dedans dans la variable globale « a ».