next up previous contents
Next: Erreurs dans des calculs Up: Erreurs à l'exécution Previous: Erreurs à l'exécution

Débordement de tableaux, erreurs de pointeurs

Même les bornes ont des limites qu'on ne saurait franchir sans les dépasser. P. Dac

Lorsque vous déclarez une variable de type tableau, vous en précisez la dimension pour qu'au début de son exécution, votre programme réserve une place suffisante en mémoire.

Si par la suite, vous tentez d'écrire ou de lire des éléments inaccessibles (théoriquement) de ce tableau, vous allez en fait accéder à des zones mémoire qui ne sont pas réservées à cet effet. Par exemple :

int tab[10];
void main()
{
  tab[10] = 33;
}

Rappelons (en est-il besoin ?) qu'en C++, les tableaux sont indexés par les entiers à partir de 0, et donc l'élément tab[10] est en fait le onzième élément du tableau tab, qui a été dimensionné pour dix éléments seulement.

Le compilateur pourrait dans ce cas précis être programmé pour vous signaler l'erreur, car le tableau est indexé par une constante (10). Mais dans le cas général, la valeur de l'index peut être le résultat d'un calcul arbitraire, et ne sera connu qu'au moment de l'exécution.

La question est : où la valeur 33 va-t-elle être rangée ? Certainement pas dans la place mémoire réservée pour tab, puisque cette dernière est prévue pour 10 éléments seulement. En fait, la réponse dépendra du contexte d'exécution. Si vous avez d'autres tableaux réservés dans le même programme, cette valeur pourra être placée dans l'un d'eux sans que, bien sûr, vous en soyez prévenu. Ou encore, et c'est nettement préférable pour vous, cette case-fantôme (la onzième d'un tableau de dix) peut correspondre à une zone inaccessible de la mémoire. Votre programme s'arrêtera alors avec le message :

Segmentation fault (core dumped)
ou bien :
Bus error (core dumped)

Le cas des erreurs de pointeurs est similaire. En effet, une mauvaise utilisation des pointeurs permet d'accéder (ou de tenter d'accéder) à des zones de la mémoire qui n'ont pas été convenablement réservées. Les conséquences sont évidemment identiques.

Pour résumer : les comportements possibles, pouvant varier d'une exécution à l'autre, dans le cas d'un dépassement de bornes de tableau ou d'une erreur de pointeur, sont les suivants :


next up previous contents
Next: Erreurs dans des calculs Up: Erreurs à l'exécution Previous: Erreurs à l'exécution

Michel COUPRIE
Thu Sep 12 13:39:33 METDST 1996