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 :
Segmentation fault
ou Bus error