Une variable locale est nécessairement déclarée à l'intérieur d'une fonction. La mémoire lui est allouée au moment de sa déclaration et est libérée dès que l'exécution de la fonction se termine. Par conséquent, son contenu est perdu dès que l'on quitte la fonction.
Analysons l'exemple suivant :
int main(void) {
fct ();
fct ();
return 0;
}
void fct(void) {
int i=0;
printf ("%d\n",i++);
}
Le programme ci-dessus utilise une fonction fct()
qui
contient une variable locale i
qui est initialisée à 0 à chaque appel de la fonction.
On en déduit que la fonction affichera toujours 0.
Une variable statique est aussi une variable déclarée à l'intérieur d'une fonction.
La différence entre une variable locale et une variable statique est que la mémoire
d'une variable statique n'est pas libérée à la fin de la fonction. La valeur d'une
variable statique est même conservée d'un appel à l'autre de la fonction. Une variable
statique se déclare avec le mot-clé static
placé avant le type de la variable :
static int i;
Reprenons l'exemple précédent et transformons la variable locale i
en variable statique :
void fct(void) {
static int i=0;
printf ("%d\n",i++);
}
On constate cette fois-ci que la variable i
est conservée d'un appel à l'autre de
la fonction. Ce mécanisme peut être utile, par exemple, pour compter le nombre de fois
qu'une fonction est appelée.
On fournit le code de la fonction factorielle()
qui retourne la factorielle d'un
entier passé en paramètre.
unsigned long int factorielle(unsigned int n) {
if (n==0) return 1;
return n*factorielle(n-1);
}
On rappelle que la factorielle est définie par :
$$ !n = 1 \times 2 \times 3 ... \times (n-1) \times n $$
Notons que cette fonction est récursive, c'est-à-dire qu'elle s'appelle elle-même. Le calcul est réalisé grâce à la formule suivante :
$$ !n = n \times !(n-1) $$
Utiliser une variable statique pour compter le nombre de fois que la fonction est appelée dans le calcule de \(!7\)).
Les variables statiques permettent
La mémoire des variables statiques ...
Qu'affiche le programme suivant ?
int main(void) {
fct();
fct();
fct();
fct();
fct();
return 0;
}
void fct(void) {
int i=0;
printf ("%d", i++);
}
i
locale à la fonction est initialisée à 0 à chaque appel.
Essaie encore ...
Qu'affiche le programme suivant ?
int main(void) {
fct();
fct();
fct();
fct();
fct();
return 0;
}
void fct(void) {
static int i=0;
printf ("%d", i++);
}
i
est une variable statique, donc sa valeur est conservée d'un appel à l'autre de la fonction fct()
.
Essaie encore ...
Qu'affiche le programme suivant ?
int main(void) {
int i;
for (i=10;i<15;i++)
fct();
return 0;
}
void fct(void) {
static int i=0;
printf ("%d", i++);
}
i
du main()
et de la fonction sont indépendantes.
Essaie encore ...