Portée et durée de vie

Les classes de stockage sont des spécificateurs qui définissent la durée de vie, la visibilité et la portée des variables et des fonctions en C. Il existe quatre classes de stockage en C : automatique, statique, externe et registre.

    Classe de stockage automatique


    Les variables déclarées avec la classe de stockage automatique ont une durée de vie limitée à la portée de la fonction dans laquelle elles ont été déclarées. Elles sont créées lorsqu'une fonction est appelée et détruites lorsque la fonction se termine. Les variables automatiques sont déclarées sans spécificateur de classe de stockage et peuvent également être déclarées avec le mot clé auto.

Exemple :

void example_function() {
   int a = 1; // Variable automatique
   auto int b = 2; // Variable automatique
}

    Classe de stockage statique


    Les variables déclarées avec la classe de stockage statique ont une durée de vie qui s'étend sur toute la durée d'exécution du programme. Elles sont initialisées une seule fois avant que le programme ne commence à s'exécuter et sont détruites lorsque le programme se termine. Les variables statiques sont déclarées avec le mot clé static.

Exemple :

 

void example_function() {
   static int c = 0; // Variable statique
   c++;
   printf("%d\n", c);
}

Dans cet exemple, la variable c conserve sa valeur entre les appels de la fonction car elle est statique.

    Classe de stockage externe


    Les variables déclarées avec la classe de stockage externe ont une portée qui s'étend sur plusieurs fichiers source. Elles sont définies dans un fichier source et déclarées avec le mot clé extern dans les autres fichiers source où elles sont utilisées.

Exemple :

 

// file1.c
int a = 10; // Variable externe

// file2.c
extern int a; // Déclaration de la variable externe

Dans cet exemple, la variable a est définie dans le fichier source file1.c et déclarée dans le fichier source file2.c.

    Classe de stockage registre


    Les variables déclarées avec la classe de stockage registre sont stockées dans les registres de processeur au lieu de la mémoire principale pour une exécution plus rapide. Cependant, l'utilisation de cette classe de stockage n'est pas garantie car le compilateur peut décider de stocker la variable en mémoire principale si nécessaire. Les variables registre sont déclarées avec le mot clé register.

Exemple :

void example_function() {
   register int i; // Variable registre
   for(i = 0; i < 100; i++) {
      printf("%d\n", i);
   }
}

Dans cet exemple, la variable i est déclarée comme une variable registre pour une exécution plus rapide de la boucle for.

Conclusion

En résumé, les classes de stockage en C définissent la durée de vie, la visibilité et la portée des variables et des fonctions. Les variables automatiques ont une durée de vie limitée à la portée de la fonction, les variables statiques ont une durée de vie qui s'étend sur toute la durée d'exécution du programme, les variables externes ont une portée qui s'étend sur plusieurs fichiers.

Si vous avez trouvé ce Cours de Langage C de Mr JoëlYk intéressants et utiles, pourquoi ne pas les partager avec d'autres personnes qui pourraient également en bénéficier ? Partagez ce lien sur les réseaux sociaux ou envoyez-le à vos amis et collègues. Vous pourriez aider quelqu'un à améliorer ses compétences en programmation ou à trouver des solutions à des problèmes complexes. N'oubliez pas que la connaissance doit être partagée pour grandir. Merci pour votre soutien et votre partage !

Contact WhatsApp : +237 652027193 | Réaliser Par Joël_Yk

Liens de l’ancien parcours (référence)

<< PREC Suiv>>

Approfondir : Portée et durée de vie

La portée dit où un nom peut être utilisé ; la durée de vie dit combien de temps l’objet existe. Ces notions sont liées mais différentes. Le mot static n’a pas le même effet selon qu’il apparaît dans une fonction ou au niveau d’un fichier.

Objet automatique local

Une variable locale ordinaire existe pendant l’exécution de son bloc. Une nouvelle invocation d’une fonction possède ses propres objets automatiques. Si l’on initialise un compteur local à zéro à chaque appel, il repart donc à zéro à chaque fois.

Objet local static

Une variable locale static conserve son objet pendant toute l’exécution du programme, tout en gardant une portée locale. Son initialisation statique n’est pas répétée à chaque appel. Cela permet un état persistant, mais impose aussi de tenir compte des appels antérieurs lors des tests.

Liaison et fichiers sources

Au niveau d’un fichier, static sert notamment à donner une liaison interne à un objet ou une fonction. extern participe aux déclarations d’entités dont une définition peut se trouver dans une autre unité de traduction. Déclarer extern ne fournit pas à lui seul la définition nécessaire à l’édition de liens. register n’est pas une garantie de placement dans un registre matériel ; ses règles doivent être lues selon la version du langage.

Stockage : compteur conservé entre appels

#include <stdio.h>
int prochain(void) {
    static int compteur = 0;
    ++compteur;
    return compteur;
}
int main(void) {
    int a = prochain();
    int b = prochain();
    int c = prochain();
    printf("%d %d %d\n", a, b, c);
    return 0;
}
Suivre le programme : Stockage, compteur conservé entre appels
Instruction ou étapeExplication
static int compteur=0Un seul objet persistant est initialisé avant les appels.
Trois instructions distinctesLes appels sont séquencés et renvoient successivement 1,2,3.
Affichage après les appelsOn ne dépend pas d’un ordre non spécifié entre arguments de printf.

Sortie écran : essai 1

Le compteur ne repart pas à zéro à chaque appel.

1 2 3

S’entraîner et vérifier

Exercice 1. Que donnerait une variable locale non static initialisée à zéro ?

Voir la correctionMasquer la correction

Chaque appel repartirait de zéro et renverrait 1 ; les trois valeurs affichées seraient 1 1 1. Le type et la portée seraient proches, mais pas la durée de vie.

Pratiquer avec le TD/TP 1 corrigé · Tous les exercices C.

Repère de lecture : les codes proposés utilisent des constructions disponibles en C11. Les règles du langage et de sa bibliothèque sont consultables dans les projets publics du WG14 (C11) et du WG14 (C23). Les exemples n’utilisent pas les nouveautés propres à C23.

Questions / Réponses

Aucune question. Soyez le premier à poser une question.
★ ★ ★ ★ ★
Aucune note. Soyez le premier à attribuer une note !

Ajouter un commentaire

Anti-spam