« Programmation C/Classe de stockage » : différence entre les versions
Contenu supprimé Contenu ajouté
m <source> -> <syntaxhighlight> (phab:T237267) |
|||
Ligne 21 :
Exemple :
<
#include <stdio.h>
Ligne 40 :
return 0;
}
</syntaxhighlight>
Résultat d'exécution du code ci dessus :
<
i vaut 1 et j vaut 1.
i vaut 2 et j vaut 1.
i vaut 3 et j vaut 1.
</
Il est déconseillé de redéfinir plusieurs fois la même variable statique dans différents blocs, car le résultat peut être surprenant :
<
#include <stdio.h>
Ligne 74 :
return 0;
}
</syntaxhighlight>
Affiche
<syntaxhighlight>
deb fun: A
deb bloc: A
Ligne 86 :
fin bloc: N
fin fun: C
</syntaxhighlight>
On voit que la durée de vie de la variable de bloc statique ne commence qu'à partir de sa déclaration, même si la déclaration n'est exécutée qu'une fois au cours du programme.
Ligne 114 :
Aujourd'hui, ce mot-clé est déconseillé sauf pour des cas particuliers, les compilateurs modernes sachant généralement mieux que le programmeur comment optimiser et quelles variables placer dans les registres.
<
#include <stdio.h>
Ligne 129 :
return 0;
}
</syntaxhighlight>
=== Classe 'auto' ===
Ligne 147 :
{{Erreur volontaire}}
<
const int i = 0;
i = 1; /* erreur*/
</syntaxhighlight>
En fait, le mot-clé <code>const</code> est beaucoup plus utilisé avec des pointeurs. Pour indiquer qu'on ne modifie pas l'objet pointé, il est bon de spécificier le mot-clé <code>const</code> :
<
void fonction( const char * pointeur )
{
Ligne 160 :
pointeur = "Nouvelle chaine de caractères";
}
</syntaxhighlight>
Dans cet exemple, on indique que l'objet pointé ne sera pas modifié. Pour indiquer que la valeur elle-même du pointeur est constante, il faut déclarer la variable de la sorte :
{{Erreur volontaire}}
<
char * const pointeur = "Salut tout le monde !";
pointeur = "Hello world !"; /* erreur*/
</syntaxhighlight>
Encore plus subtil, on peut mélanger les deux :
{{Erreur volontaire|nombre=2}}
<
const char * const pointeur = "Salut tout le monde !";
pointeur = "Hello world !"; /* erreur*/
pointeur[0] = 0; /* erreur*/
</syntaxhighlight>
Cette dernière forme est néanmoins rarement usitée. En outre ce dernier exemple présente un autre problème qui est la modification d'une chaine de caractères « en dur », qui sont la plupart du temps placées dans la section lecture seule du programme et donc inaltérables.
Ligne 183 :
Attention <code>const</code> n'est pas une protection réelle contre les changements de valeur, qu'elles proviennent d'un comportement indéfini, ou de constructions valides du C telle que
<
const char lettre = 'A';
memset(&lettre, 'B', 1);
putchar(lettre); /* affiche B */
</syntaxhighlight>
En outre certaines constructions du C même si elles n'indiquent pas être <code>const</code> le sont effectiement.
<
int nombres[3] = {1, 2, 3};
int * autres_nombres;
Ligne 197 :
char * phrase = "Salut tout le monde !";
phrase[0] = 's'; /* erreur probable à l'exécution, une chaine de caractères littérale ne peut pas être modifiée */
</syntaxhighlight>
=== Qualificateur 'volatile' ===
|