Une variable statique et une variable globale résident toutes deux dans un segment de données. Néanmoins, la variable statique a une scope limitée. Pourquoi?

Dans un programme C typique, les variables statiques et globales résident sur le segment de données. Néanmoins, la scope de la variable statique est limitée au fichier. Au contraire, la variable globale est accessible de n’importe où. Pourquoi cela se produit-il bien que les deux résident dans la même mémoire?

 Why does it happen, although both resides in the same memory? 

Réponse courte:-

À partir de la norme C11 ( 6.2.2 Liens d’identificateurs ), paragraphe 4:

Si la déclaration d’un identifiant d’étendue de fichier pour un object ou une fonction contient le spécificateur storageclass, cet identifiant dispose d’ un lien interne .

La liaison interne signifie qu’elle est visible uniquement à l’intérieur de son unité de translation .

Réponse détaillée:

Une variable globale (sans statique) a une liaison externe, ce qui signifie qu’elle est visible pour les autres unités de traduction.

Lorsque vous déclarez des variables statiques avec une étendue de fichier, il existe une liaison interne, mais lorsque vous le déclarez avec une étendue de bloc, aucune liaison n’est établie.

Permet de comprendre quelques termes spécifiquement. (Inspiré des mots-clés C (statique) )

La variable AC a l’un des liens suivants:

  • pas de liaison: – Les variables avec une scope de bloc n’ont pas de liaison. Cela signifie qu’elles sont privées du bloc dans lequel elles sont définies. Toutes les variables avec des durées de stockage automatique, dynamic et dynamic ont cette liaison, ainsi que des variables déclarées statiques à la scope du bloc. Une variable avec une étendue de fichier peut avoir un lien interne ou externe.
  • Liaison interne: – La variable peut être référencée à partir de toutes les scopes de l’unité de traduction en cours. Toutes les variables déclarées à la taille du fichier ont cette liaison, y compris les variables déclarées statiques à la scope du fichier.
  • lien externe: – La variable peut être référencée à partir de toute autre unité de traduction du programme entier. Toutes les variables déclarées extern ou const sans spécificateur de classe de stockage explicite, mais non statique, ont cette liaison.

par exemple-

 int i = 5; // file scope, external linkage static int j = 3; // file scope, internal linkage ... ... int main() { ... ... } int func () { static int num;// block scope – no linkage . . . } 

En déclarant une variable statique au niveau du fichier ( static dans function a une signification différente), vous interdisez à d’autres unités d’y accéder, par exemple si vous essayez d’utiliser la variable dans une autre unité (déclarée avec extern ), l’éditeur de liens ne trouvera pas ce symbole.

L’accent mien 🙂

Intentionnellement.

static at global scope est le mot-clé que vous utilisez pour signifier “je veux que ces variables aient une scope limitée; je ne veux pas avoir à me soucier des autres modules qui ont déclaré des variables du même nom”. La raison d’utiliser ce mot clé est différente de ne pas l’utiliser, c’est en fait exactement la raison de son existence.

Notez que le mot clé signifie différentes choses dans différents contextes; at function scope static signifie que “le contenu de cette variable doit persister entre les appels de fonctions”.

La disposition réelle des données en mémoire qui en résulte est un détail de la mise en œuvre et varie selon les compilateurs et les plates-formes.

L’idée des variables statiques est qu’elles ne sont pas globales et ne “polluent” pas l’espace de noms global. Cela signifie que je peux utiliser la variable ‘count’ dans 5 fonctions différentes et qu’elles ne s’affronteront pas. La scope limite les variables à leur contexte.

Techniquement, vous pouvez accéder à n’importe quoi. Le compilateur ne vous donnerait tout simplement pas une adresse de mémoire – vous devrez l’obtenir vous-même. En quelque sorte.