8
votes

C variable globale et statique stockant en mémoire

de ce que j'ai appris sur les variables globales et statiques, Si une variable C est déclarée extérieure à toutes les fonctions dans un fichier source comme suit: xxx pré>

Cette variable est accessible par d'autres fichiers une fois qu'il a une déclaration externe pour elle dans ce fichier.
Mais si la même variable est déclarée comme suit: p> xxx pré>

alors cette variable peut être utilisée uniquement par le fichier actuel, tout autre fichier ne pourra pas voir cette variable. P >

  1. Lorsque le programme est chargé dans la mémoire au moment de l'exécution, la variable globale et statique est présente dans la section Données de ce programme.
    Je tiens à comprendre que, comme les deux sont stockés dans le même segment de mémoire, comment la variable statique est-elle protégée de ne pas être utilisée dans une instruction hors de sa portée.
    Ce que je pense, c'est que la portée de la variable et son accès seront pris en charge par le compilateur. S'il vous plaît commenter si je me trompe et ajoute si je manque des détails. P> li>

  2. Concernant la variable externe. Si, p>

    extern int a;  
    

c

0 commentaires

5 Réponses :


1
votes

Avoir une variable statique à la portée du fichier le rend invisible à la liaison au moment de la liaison. Le compilateur ne délivrait pas une directive qu'un symbole (nommé correspondait de manière correspondante à la variable) doit être visible pour la liaison.

Concernant la deuxième question, extern int a est juste une déclaration. Il ne réserve aucun espace pour cette variable, mais informe simplement le compilateur qu'une telle variable existe quelque part. Lorsque l'appareil est lié ultérieurement, la référence à cette variable est résolue par la liaison.


0 commentaires

2
votes
  1. Variables statiques Vous avez attribué une adresse et une taille dans la mémoire, mais elles ne sont pas annoncées. Donc, si j'ai un statique int A; dans un fichier et essayez de vous référer à celui-ci avec extern int a; dans un autre fichier, on ne peut pas trouver le "link end", Donc, cela ne fonctionne pas.

    Pour faire extern travail, il doit y avoir "quelque chose" qui annonce A comme disponible, quel statique ne fait pas.

  2. Non, ils n'appartiennent pas à différents processus. Ils sont liés ensemble dans un fichier exécutable qui est ensuite exécuté. Différents processus ne peuvent normalement pas accéder à la mémoire de chacun.


0 commentaires

12
votes

Tout d'abord, différents processus ont des espaces d'adresse différents, comme vous l'avez dit. Donc, à moins que vous ne les partageez explicitement (mémoire partagée ou similaire), ils ne partagent aucune mémoire.

À propos des variables globales statiques et globales non statiques, la différence est appelée linkage : les variables globales non statiques ont lien externe , ce qui signifie qu'ils ont un nom Pour la liaison, et donc une unité de compilation (fichier .C) peut accéder à la variable définie dans une autre.

Une variable globale statique, cependant, a une liaison interne, et donc, bien qu'elle puisse être dans le même bloc de mémoire que celle du premier, il n'a aucun nom pour la liaison, et il ne peut donc pas être utilisé à partir d'une autre unité de compilation que c'est propre.


0 commentaires

1
votes

1 Ce que je pense, c'est que la portée de la variable et son accès seront pris en charge par le compilateur. S'il vous plaît commenter si je me trompe et ajoute si je manque des détails. P>

c'est correct. Le compilateur C ne rend pas cette variable accessible à une autre unité de compilation. Vous ne pouvez donc pas compiler avec succès un programme accessible directement à cette variable. C appelle ce concept Linkage . P>

Vous pouvez écrire un Fonction non statique qui renvoie son adresse pour obtenir un accès indirect à celui-ci: p>

static int a;

int *get_a(void)
{ 
  return &a;
}

0 commentaires

0
votes

Les deux fichiers appartiennent à différents processus signifie que le compilateur a absolument aucune référence pour quel extern int a; fait référence à. Il ne cherche pas chaque morceau de code sur votre ordinateur et espérons qu'il trouve un et un seul int A; Déclaration, puis ajoutez un tas de programmation pour détecter et accéder à la mémoire de ce processus. En plus d'être un comportement terrible, la quantité de complexité serait absurde sans aucune garantie réelle de fonctionner.


0 commentaires