erreurs classiques
Cette page contient une liste de quelques erreurs classiques que l'on peut faire en programmant en C. Un des gros problèmes de la programmation (en générale, mais surtout en C) est qu'on peut avoir des programmes faux qui ont l'air de marcher mais vont planter dans certaines situations (dans un environement different ou après un long moment).
*ptr++
-
Cette expression n'incrémente pas la valeur stockée dans *ptr (ce n'est pas la même chose que (*ptr)++), mais la valeur de ptr (*ptr++ = *(ptr++)). Il est donc conseillé d'utiliser des parenthèses dans ce genre de cas, afin d'être sûr de ce qui se passe.
sizeof(void)
-
sizeof(void) vaut 1, même si ça paraît un peu illogique (puisque void veut dire 'rien').
int i;
scanf("%d", i);
scanf("%d", i);
-
scanf prend des pointeurs (puisque ça modifie l'entrée). Il faut donc faire scanf("%d", &i).
#define f(p) p*5
...
f(3+4)
...
f(3+4)
-
Il faut faire très attention avec l'utilisation des macros, car il est facile d'introduire des erreurs, et il est très difficile de retrouver ces erreurs. Il faut se rappeler que les macros se font recopier tel quel dans le code, donc ce petit bout de code va retourner 23 (et non 45). Il aurait été plus judicieux de déclarer la macro ainsi: #define f(p) (p)*5.
C'est pour cette même raison qu'il faut toujours essayer d'utiliser des fonctions et constantes à la place des macros.
Pitfalls and Subtleties of Macros.
if (a=10) {...
-
Le language C n'a pas de type boolean. Le code ci-dessus va donc assigner la valeur 10 à la variable a et ensuite retourner 10 (qui est vrai). La condition sera donc toujours vrai. Le code correct aurait été: if (a==10) {...
Note: je vous conseil de toujours choisir une police qui permet de facilement distinguer la différence entre = et ==.
for (i=0; i<10; i++);
faire_qqch_plusieurs_fois;
faire_qqch_plusieurs_fois;
-
Le ; à la fin du for va faire que la boucle est vide. La partie
faire_qqch_plusieurs_fois ne sera en fait exécuté qu'une seule fois.
char* a, b
-
b est un char (et non un char*) !
Je conseil d'écrire de tel lignes comme: char *a, *b ou sur plusieurs lignes.
int i;
int t[10];
for (i=0; i<=10; i++)
t[i]=...;
int t[10];
for (i=0; i<=10; i++)
t[i]=...;
-
Les tableaux en C vont de 0 à N-1. La condition de la boucle for est fausse (devrai être: for (i=0; i<10; i++).