Ce qui vous manque est que le compilateur n'est pas nécessaire pour attraper ce cas, et souvent non. C'est un comportement indéfini, ce qui signifie qu'il n'y a aucune exigence quant à ce que l'implémentation fait, et c'est votre travail de l'éviter. En règle générale, le compilateur compilera simplement ce qu'il voit en cas de comportement indéfini, et le comportement parfois raisonnable qui en résulte peut être déroutant.
Dans ce cas, vous avez enregistré une adresse mémoire dans numeros
, et dans la déclaration suivante fait référence *(numeros + 900)
, qui, étant donné la taille int
habituelle serait 3600 octets après l'adresse de mémoire. Le compilateur a généré le code pour la référence. Considérant qu'il s'agit d'un comportement indéfini, le compilateur a parfaitement raison de le faire, ou d'écrire un courriel insultant à vous ou votre mère; la norme ne spécifie rien. Il pourrait, bien sûr, détecter cela et vous donner une erreur d'exécution en disant "Adresse hors limites à la ligne 7", mais malheureusement, aucun des compilateurs que j'ai utilisé ne vous donne cette option.
Ceci est l'une des parties les plus délicates de la programmation C: s'assurer que votre programme est bien défini.
* À moitié gags * il peut aussi écrire '10' dans une partie du système d'exploitation et, à cause de cela, formater votre disque dur :-) – pmg
@pmg: Yeap, ou envoyer tous vos mots de passe sur le réseau - similaire à cette instance UB http://stackoverflow.com/questions/908872/whats-the-worst-example-of-undefined-behaviour-actually-possible/3554343#3554343 – sharptooth