Historique de la question : Les variables globales et statiques ont été introduites en C pour stocker des données en dehors du contexte local des fonctions. L'initialisation automatique préalable et le placement de ces variables dans des sections spéciales du fichier exécutable optimisent le fonctionnement du programme, mais cela peut également conduire à un comportement peu évident si cela n'est pas compris.
Problème : Il est important de savoir que les variables globales et statiques en C sont initialisées soit avec une valeur explicitement spécifiée, soit automatiquement à zéro (Initialisation à zéro). L'initialisation se produit avant le début de main, ce qui réduit le risque d'accès à des données non initialisées, mais dans certaines conditions, cela peut entraîner des dépendances inattendues liées à l'initialisation de plusieurs modules et à l'ordre de leur chargement.
Solution :
Exemple de code :
#include <stdio.h> static int stat_var; int glob_var = 42; int main() { printf("statique : %d, global : %d ", stat_var, glob_var); }
Caractéristiques clés :
1. Peut-on se fier à l'effacement implicite des variables statiques et considérer cela comme une pratique sûre ?
Techniquement, cela fonctionne, mais dans de grands projets, il est préférable d'initialiser les variables explicitement pour améliorer la lisibilité et prévenir les modifications potentielles dans les compilateurs/linkers.
2. Quel sera le résultat si une variable statique est déclarée dans une fonction externe sans initialisation ?
Elle sera tout de même initialisée à zéro : static int value; au lancement est toujours égal à 0.
3. Quand l'initialisation d'une variable globale avec un initialiseur se produit-elle si la variable est déclarée dans un module isolé ?
L'initialisation se produit avant l'appel de main, mais entre différents modules, la norme ne garantit pas l'ordre d'initialisation de ces variables, ce qui peut entraîner un accès à des données non initialisées dans le constructeur d'un autre module.
Le développeur a déclaré des variables statiques pour stocker un état commun, supposant qu'elles seraient toujours explicitement initialisées.
Avantages :
Inconvénients :
Après révision, les variables ont été explicitement initialisées au moment de la déclaration.
Avantages :
Inconvénients :