Perché in C non c'è nessun bound-checking sugli array, ovvero non viene controllato esplicitamente che tu stia "dentro" alle dimensioni dell'array. Se sfori da un array per quanto riguarda lo Standard è "undefined behavior" - può succedere qualunque cosa, dal "non succede niente" al "il computer avvia una guerra nucleare".
In pratica in realtà quando sfori da un array in genere quel che succede è che vai a sovrascrivere memoria riservata ad altre variabili (o per altri fini), il che significa che inizi a riscontrare dei bug "impossibili" (variabili che cambiano valore apparentemente senza perché); se poi esageri veramente vai a toccare memoria marcata come "non allocata" e allora ottieni un crash.