Une variable locale statique est définie à l'aide du mot clé static à l'intérieur d'une fonction. Contrairement aux variables locales ordinaires, elle conserve sa valeur entre les appels de la fonction et est initialisée une seule fois. Une telle variable existe pendant toute la durée de vie du programme, mais n'est visible qu'à l'intérieur de sa fonction.
Variable locale ordinaire :
void func() { int count = 0; // initialisée à chaque fois count++; printf("%d ", count); }
Chaque sortie sera 1.
Variable locale statique :
void func() { static int count = 0; // initialisée uniquement une fois count++; printf("%d ", count); }
Lors d'appels successifs, nous obtiendrons les sorties : 1, 2, 3, ...
Utilisation : pratique pour compter le nombre d'appels d'une fonction, pour le mise en cache de valeurs simples.
"Une variable locale statique sera-t-elle détruite après la sortie de la fonction et que se passera-t-il avec sa valeur lors du prochain appel de la fonction ?"
On répond souvent qu'elle est détruite, mais ce n'est pas le cas.
Réponse correcte : La variable locale statique existe pendant toute la durée de vie du programme. Elle conserve sa valeur entre les appels de la fonction et est initialisée une seule fois (lors de la première entrée dans la fonction ou avant main).
Histoire 1
Dans un projet, les indicateurs de temps d'entrée dans un module étaient mesurés par une fonction qui devait compter chaque entrée. Ils ont confondu int counter = 0; avec static int counter = 0; — la fonction renvoyait toujours 1, et la statistique s'est révélée inutile.
Histoire 2
Dans un service non sécurisé par des threads, une variable statique était utilisée dans une fonction invoquée depuis différents threads. Cela a conduit à des états de concurrence et à des résultats incorrects aléatoires. Ils n'avaient pas tenu compte du fait que la mémoire partagée n'était pas protégée.
Histoire 3
Ils ont stocké un pointeur sur une mémoire allouée dynamiquement dans une variable statique pour la mise en cache. Lors de la relance de la fonction, la mémoire ancienne n'était pas libérée : une fuite de mémoire se produisait à chaque appel.