Quelle est l’utilisation de la variable locale statique quand on peut obtenir une variable globale au même coût?

En C, à quoi sert la classe de stockage statique lorsqu’une variable externe peut remplir sa fonction au même coût, c’est-à-dire. les deux occupent de l’espace de stockage dans le segment de données de l’exécutable.

J’ai une bien meilleure scope avec une variable externe. Si je veux que la scope d’une variable externe soit un fichier spécifique, je ne déclare pas cette variable sinon où.je vois beaucoup de souplesse avec une variable globale que la variable locale statique

Et nous pouvons faire référence à une variable statique locale en dehors de la fonction si nous avons l’adresse de la variable.La mémoire de la variable statique locale sera dans le segment de données, pas dans le cadre de stack de la fonction. .

Je veux juste savoir si statique a un but subtil dont je ne suis pas au courant.

    Vous écrivez qu’une variable globale a une «meilleure» scope. Ceci est une erreur. Il a une plus grande scope. Plus gros n’est pas meilleur.

    Plus gros peut être nécessaire, si vous avez besoin d’ un identifiant visible dans plus d’endroits, mais ce n’est souvent pas le cas. Mais une plus grande scope signifie plus d’exposition aux erreurs. Les variables globales confondent la sémantique des routines en rendant plus difficile la visualisation de l’état du programme qu’elles utilisent et modifient, ce qui augmente la probabilité d’erreurs causées par la non déclaration d’un identifiant local et d’autres erreurs.

    En particulier, un identifiant avec une liaison externe entrera en collision avec des identifiants dans d’autres bibliothèques. Pensez à ce qui se passe lorsque vous écrivez une application de physique, que vous avez un identifiant externe nommé acceleration et que vous vous connectez à une bibliothèque de physique qui possède également un identifiant externe nommé acceleration . Le programme va échouer. Pour cette raison, les identifiants externes sont généralement mal conçus.

    L’erreur humaine est une limite importante à notre capacité à développer et à maintenir des logiciels complexes. Une grande partie de la sémantique du langage de programmation limite le langage pour éviter les erreurs. Avec un ordinateur brut, vous pouvez append deux pointeurs, supprimer votre pointeur de stack, charger accidentellement les octets d’un float dans un registre entier, etc. Les bons langages de programmation rendent ces erreurs difficiles à commettre par erreur.

    Les variables globales constituaient une source d’erreur plus importante avant que les règles de périmètre ne permettent de les contrôler. Les bons programmeurs limitent la scope de leurs identificateurs.

    Une variable globale est bien, globale, on peut y accéder de n’importe où.

    Une variable locale statique a une scope locale. Il est statique, de sorte que sa durée de vie s’exécute sur toute la durée de vie de l’application, mais que vous ne pouvez y accéder qu’à partir de la scope locale (que cette scope soit une fonction, un bloc ou un fichier).

    La différence fondamentale est sur la scope de la variable.

    1) La variable globale est globale pour l’ensemble du projet. Disons que votre projet a 10 fichiers différents, puis que les 10 fichiers peuvent accéder à la variable globale (voir comment utiliser extern).

    2) la variable / fonction statique peut être utilisée par la fonction / le fichier dans lequel elle est définie. Il ne peut être utilisé par aucun autre fichier de votre projet.

    Cependant, vous pouvez modifier la variable statique (définie dans func1 ()) dans func2 () en transmettant la référence de la variable. veuillez regarder dans l’exemple ci-dessous,

     void func2(int *i) { (*i)++; } void func1() { static int i; i=1; printf("%d\n", i); func2(&i); printf("%d\n", i); } int main() { func1(); return 0; } 

    Comme vous le voyez ci-dessus, func1 () a static int i qui ne peut pas être directement manipulé par func2 (), mais si vous transmettez la référence de la variable, vous pouvez toujours manipuler la variable comme une variable ordinaire.

    J’espère que ça aide…

    La différence entre local et global est d’ abord et avant tout la scope: vous pouvez accéder aux variables locales uniquement à partir du bloc dans lequel elles sont définies, tandis que les variables globales sont accessibles de n’importe où. Par conséquent, vous ne pouvez avoir qu’une seule variable avec un nom donné dans la scope globale, mais vous pouvez avoir plusieurs variables statiques locales dans différentes fonctions.

    Comme pour les variables globales statiques et les variables externes: oui, les variables globales statiques sont locales à l’unité de traduction (c’est-à-dire le fichier source .c dans lequel elles sont définies).

    Donc, la principale préoccupation ici est la notion de scope, et le stockage vient naturellement de là.

    La raison pour laquelle vous devez utiliser une variable statique locale est scope, ce qui vous évite certaines situations sujettes aux bogues, car vous ne pourrez pas y faire référence en dehors de la fonction dans laquelle elle a été définie.

    Voici un programme court qui montre la différence:

     #include  static int a=20; void local() { printf("%d,addr:%d \n", a, (void*)&a); a = 100; } int main() { { static int a = 10; printf("%d,addr:%d \n", a, (void*)&a); local(); } printf("%d addr:%d \n", a, (void*)&a); } 

    Sortie:

     10,addr:134518604 -- local static inside the braces 20,addr:134518600 -- this is referring the global static variable 100 addr:134518600 -- This is referring the global static variable which is outside of the braces. 

    Ici, les accolades sont également importantes: si aucune accolade n’est utilisée dans la fonction main() , il ne fait alors référence qu’à une variable statique locale.