Les variables statiques en C sont-elles réallouées chaque fois que la fonction parent est appelée?

Supposons que j’ai une variable statique déclarée à l’intérieur d’une fonction en C.

Si j’appelle cette fonction plusieurs fois, la variable statique est-elle réallouée en mémoire chaque fois que la fonction est appelée?

Si elle est réaffectée, pourquoi la dernière valeur est-elle toujours conservée?

Exemple:

void add() { static int x = 1; x++; printf("%d\n",x); } int main() { add(); // return 2 add(); // return 3 add(); // return 4 } 

Non – les variables statiques sont fondamentalement des globales qui résident dans l’espace de noms local.

Non, la variable n’est pas réaffectée à chaque fois. C’est comme avoir une variable globale, mais elle n’a qu’une scope locale; c’est-à-dire que vous ne pouvez le référencer que depuis l’intérieur de cette fonction.

Non,

Sinon, comment devrait-il conserver sa valeur entre les appels de fonction?

Les variables statiques ressemblent aux variables globales à cet égard, mais elles sont locales à la scope environnante (fonction, classe, espace de nom).

La variable statique n’est pas réaffectée à chaque appel de la fonction. Ils agissent comme des variables locales normales. Mais elles diffèrent par la durée de stockage, c’est-à-dire lorsqu’une fonction atsortingbue une valeur aux variables statiques, cette valeur est conservée entre les appels de fonction.

Dans le langage de programmation C, statique est utilisé avec les variables globales et les fonctions pour définir leur scope sur le fichier contenant. Dans les variables locales, static est utilisé pour stocker la variable dans la mémoire allouée de manière statique au lieu de la mémoire allouée automatiquement. Bien que le langage ne dicte la mise en œuvre d’aucun type de mémoire, la mémoire allouée statiquement est généralement réservée dans le segment de données du programme au moment de la compilation, tandis que la mémoire allouée automatiquement est normalement implémentée sous forme de stack d’appels transitoires.

Comme le préfixe statique suggère que la variable est dans la mémoire statique, elle contient des variables dont les adresses sont connues au moment de la compilation (une manière quelque peu pédante de dire avec des variables globales). Cela diffère des variables automatiques (allouées sur la stack) et des variables dynamics (allouées sur le tas avec malloc).

L’initialisation des variables statiques dans les fonctions (ou autres statiques) est effectuée avant l’exécution du programme. Plus précisément, cela signifie qu’il ne peut s’agir que d’une expression constante, que le compilateur peut obtenir au moment de la compilation.

Cela signifie que le programme suivant n’est pas valide:

 int f(int x){ return x+1; } int main(){ static int a = f(1); return a; } 

Lorsque je le comstack avec gcc, il se plaint comme prévu avec le message suivant:

 error: initializer element is not constant 

Cependant, lorsque le programme est exécuté, vous pouvez modifier la valeur des variables statiques comme toutes les autres.