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: Cette variable est accessible par d'autres fichiers une fois qu'il a une déclaration externe pour elle dans ce fichier. alors cette variable peut être utilisée uniquement par le fichier actuel, tout autre fichier ne pourra pas voir cette variable. P > 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. Concernant la variable externe.
Si, p>
Mais si la même variable est déclarée comme suit: p>
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>
extern int a;
5 Réponses :
Avoir une variable code> statique code> à 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. P>
Concernant la deuxième question, extern int a code> 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. P>
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 Pour faire 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. P>
li>
ol> statique int A; code> dans un fichier et essayez de vous référer à celui-ci avec extern int a; code> dans un autre fichier, on ne peut pas trouver le "link end", Donc, cela ne fonctionne pas. P>
extern code> travail, il doit y avoir "quelque chose" qui annonce A code> comme disponible, quel statique code> ne fait pas. p>
li>
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. P>
À propos des variables globales statiques et globales non statiques, la différence est appelée linkage em>: les variables globales non statiques ont lien externe em>, 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. P>
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. p>
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; }
Les deux fichiers appartiennent à différents processus code> signifie que le compilateur a absolument aucune référence em> pour quel extern int a; code> 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; code> 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. P>