Classes de stockage en C : Auto, Extern, Static, Register (Exemples)

⚡ Résumé intelligent

En C, les classes de stockage définissent la portée, la durée de vie, la valeur par défaut et l'emplacement mémoire de chaque variable, à l'aide de quatre spécificateurs — auto, register, static et extern — pour contrôler où résident les données et combien de temps elles survivent pendant l'exécution.

  • 🇧🇷 Quatre classes de stockage : Le langage C propose les spécificateurs auto, register, static et extern pour décrire chaque variable.
  • 🏠 Voiture: La classe locale par défaut, confinée à son bloc et contenant une valeur indéfinie jusqu'à ce qu'elle soit assignée.
  • | Pour s'inscrire : Demande un espace de stockage dans les registres du processeur pour un accès plus rapide aux variables fréquemment utilisées telles que les compteurs.
  • ♻️ Statique: Conserve la valeur d'une variable entre les appels de fonction et la définit par défaut à zéro lors de sa première utilisation.
  • 🌐 Externe: Permet de partager une variable ou une fonction globale entre plusieurs fichiers sources sans la redéfinir.
  • (I.e. Portée et durée de vie : Chaque classe définit où une variable est visible et combien de temps elle dure.

Classes de stockage en C

Qu’est-ce que la classe de stockage en C ?

Une classe de stockage représente la visibilité et l'emplacement d'une variable. Il indique à partir de quelle partie du code on peut accéder à une variable. Une classe de stockage en C est utilisée pour décrire les éléments suivants :

  • La portée variable.
  • L'emplacement où la variable sera stockée.
  • La valeur initialisée d'une variable.
  • La durée de vie d'une variable.
  • Qui peut accéder à une variable ?

Ainsi, une classe de stockage est utilisée pour représenter les informations sur une variable.

REMARQUE : Une variable n'est pas seulement associée à une Type de données, sa valeur mais aussi une classe de stockage.

Quels sont les types de classes de stockage en C ?

Il existe au total quatre types de classes de stockage standard. Le tableau ci-dessous représente les classes de stockage en C.

Classe de stockage Interet
auto Il s'agit d'une classe de stockage par défaut.
externe C'est une variable globale.
statique Il s'agit d'une variable locale capable de renvoyer une valeur même lorsque le contrôle est transféré à l'appel de fonction.
vous inscrire C'est une variable qui est stockée dans un registre.

Classe de stockage automatique en C

Les variables définies à l'aide de la classe de stockage automatique sont appelées variables locales. Auto signifie classe de stockage automatique. Une variable est dans la classe de stockage automatique par défaut si elle n'est pas explicitement spécifiée.

La portée d'une variable automatique est limitée au bloc particulier uniquement. Une fois le contrôle sorti du bloc, l'accès est détruit. Cela signifie que seul le bloc dans lequel la variable auto est déclarée peut y accéder.

Un mot-clé auto est utilisé pour définir une classe de stockage automatique. Par défaut, une variable automatique contient une valeur inutile.

Example, auto int age;

Le programme ci-dessous définit une fonction avec deux variables locales

int add(void) {
   int a=13;
   auto int b=48;
return a+b;}

Nous prenons un autre programme qui montre le niveau de portée « niveau de visibilité » pour les variables automatiques dans chaque code de bloc qui sont indépendamment les unes des autres :

#include <stdio.h>
int main( )
{
  auto int j = 1;
  {
    auto int j= 2;
    {
      auto int j = 3;
      printf ( " %d ", j);
    }
    printf ( "\t %d ",j);
  }
  printf( "%d\n", j);}

Sortie :

 3 2 1

Classe de stockage externe en C

Extern signifie classe de stockage externe. La classe de stockage externe est utilisée lorsque nous avons des fonctions ou des variables globales partagées entre deux ou plusieurs fichiers.

Le mot-clé extern est utilisé pour déclarer une variable ou une fonction globale dans un autre fichier afin de fournir une référence à une variable ou une fonction déjà définie dans le fichier d'origine.

Les variables définies à l'aide d'un mot-clé extern sont appelées variables globales. Ces variables sont accessibles tout au long du programme. Notez que la variable externe ne peut pas être initialisée, elle a déjà été définie dans le fichier d'origine.

Example, extern void display();

Premier fichier : main.c

#include <stdio.h>
extern i;
main() {
   printf("value of the external integer is = %d\n", i);
   return 0;}

Deuxième fichier : original.c

#include <stdio.h>
i=48;

Résultat:

 value of the external integer is = 48

Afin de compiler et d'exécuter le code ci-dessus, suivez les étapes ci-dessous

Étape 1) Créer un nouveau projet,

  • Sélectionnez l'application console
  • Cliquez sur Aller

Créer un nouveau projet dans Code Blocs

Étape 2) Sélectionnez C et cliquez sur Suivant

Sélectionnez le langage C

Étape 3) Cliquez sur Suivant

Cliquez Sur Suivant

Étape 4) Saisissez les informations et cliquez sur Suivant

Entrez les détails du projet

Étape 5) Cliquez sur Terminer

Cliquez sur Terminer

Étape 6) Placez le code principal, tel qu'il apparaît dans le programme précédent, dans le fichier main.c et enregistrez-le.

Ajoutez du code à main.c

Étape 7) Créez un nouveau fichier C [Fichier -> nouveau -> Fichier vide , enregistrez-le (sous le nom original.c) et ajoutez-le au projet actuel en cliquant sur « OK » dans la boîte de dialogue.

Créer un fichier original.c

Étape 8) Placez et enregistrez le code C du fichier original.c présenté dans l'exemple précédent sans la fonction main().

Ajouter le code au fichier original.c

Étape 9) Compilez et exécutez votre projet. Le résultat est illustré dans la figure suivante.

Sortie du programme

Classe de stockage statique en C

Les variables statiques sont utilisées dans la fonction/fichier en tant que variables statiques locales. Ils peuvent également être utilisés comme variable globale

  • Une variable locale statique est une variable locale qui conserve et stocke sa valeur entre les appels de fonction ou le bloc et reste visible uniquement par la fonction ou le bloc dans lequel elle est définie.
  • Les variables globales statiques sont des variables globales visibles uniquement par le fichier dans lequel elles sont déclarées.
Example: static int count = 10;

Gardez à l’esprit que la variable statique a une valeur initiale par défaut nulle et n’est initialisée qu’une seule fois dans sa vie.

#include <stdio.h> /* function declaration */
void next(void);
static int counter = 7; /* global variable */
main() {
 while(counter<10) {
      next();
      counter++;   }
return 0;}
void next( void ) {    /* function definition */
   static int iteration = 13; /* local static variable */
   iteration ++;
   printf("iteration=%d and counter= %d\n", iteration, counter);}

Résultat:

iteration=14 and counter= 7
iteration=15 and counter= 8
iteration=16 and counter= 9

Les variables globales sont accessibles dans tout le fichier tandis que les variables statiques ne sont accessibles qu'à la partie particulière d'un code.

La durée de vie d'une variable statique réside dans l'ensemble du code du programme. Une variable déclarée ou initialisée à l'aide du mot-clé static contient toujours zéro comme valeur par défaut.

Enregistrer la classe de stockage en C

Vous pouvez utiliser la classe de stockage de registre lorsque vous souhaitez stocker des variables locales dans des fonctions ou des blocs dans des registres CPU au lieu de RAM pour avoir un accès rapide à ces variables. Par exemple, les « compteurs » sont de bons candidats pour être stockés dans le registre.

Example: register int age;

Le mot-clé `register` est utilisé pour déclarer une classe de stockage de type registre. Les variables déclarées à l'aide de cette classe de stockage ont une durée de vie qui s'étend sur toute la durée du programme.

Elle est similaire à la classe de stockage automatique. La variable est limitée au bloc particulier. La seule différence est que les variables déclarées à l'aide de la classe de stockage des registres sont stockées dans les registres du processeur au lieu d'une mémoire. Register a un accès plus rapide que celui de la mémoire principale.

Les variables déclarées à l'aide de la classe de stockage de registre n'ont pas de valeur par défaut. Ces variables sont souvent déclarées au début d'un programme.

#include <stdio.h> /* function declaration */
main() {
{register int  weight;
int *ptr=&weight ;/*it produces an error when the compilation occurs ,we cannot get a memory location when dealing with CPU register*/}
}

Sortie :

error: address of register variable 'weight' requested

Le tableau suivant résume les principales fonctionnalités de chaque classe de stockage qui sont couramment utilisées en programmation C.

Classe de stockage Déclaration Stockage Valeur initiale par défaut Domaine À vie
auto À l'intérieur d'une fonction/bloc Mémoire Imprévisible Dans la fonction/le bloc Dans la fonction/le bloc
vous inscrire À l'intérieur d'une fonction/bloc Registres du processeur Déchets Dans la fonction/le bloc Dans la fonction/le bloc
externe En dehors de toutes les fonctions Mémoire Zero Compléter le fichier et les autres fichiers où la variable est déclarée comme externe durée d'exécution du programme
Statique (local) À l'intérieur d'une fonction/bloc Mémoire Zero Dans la fonction/le bloc durée d'exécution du programme
Statique (mondial) En dehors de toutes les fonctions Mémoire Zero Importation durée d'exécution du programme

FAQ

La portée détermine où une variable est visible dans le code, tandis que sa durée de vie détermine combien de temps elle reste en mémoire. Une variable peut avoir une portée de bloc et une durée de vie de programme.

Les deux créent des variables locales à portée de bloc, mais la première les conserve en mémoire avec une valeur par défaut inutilisable, tandis que la seconde utilise un stockage plus rapide dans les registres du processeur et interdit de récupérer l'adresse de la variable.

L'instruction `no.register` n'est qu'une requête ; le compilateur peut l'ignorer si aucun registre n'est disponible. Les compilateurs modernes optimisent automatiquement l'utilisation des registres, de sorte que ce mot-clé est désormais rarement nécessaire.

Les variables statiques et externes résident dans un segment de mémoire initialisé à zéro pour l'ensemble du programme ; elles commencent donc à zéro. Les variables automatiques réutilisent la mémoire de la pile.ping quelle que soit la valeur qui subsistait.

Une déclaration `extern` indique seulement qu'une variable est définie ailleurs et ne peut pas être initialisée. La définition proprement dite, dans un fichier, alloue l'espace mémoire, et l'édition de liens connecte toutes les références à cette variable.

En grande partie, mais pas exactement. C++ Le mot-clé `register` est obsolète et `auto` est réutilisé pour l'inférence de type. `static` et `extern` se comportent de manière similaire. C++ ajoute des règles de stockage thread_local et class-member.

Oui. Les assistants IA décrivent les variables auto, register, static et extern, suggèrent le spécificateur approprié pour chaque variable et signalent les utilisations incorrectes, comme la prise de l'adresse d'une variable de type registre.

Copilote GitHub Il complète automatiquement les compteurs statiques, les déclarations externes dans les fichiers et les indications de registre, puis explique la portée et la durée de vie en temps réel pendant que vous tapez.

Résumez cet article avec :