Ludzie piszą o modelu pamięci i o crashowaniu "programu na drugim końcu", a nikt nie wspomniał o rzeczywistej przyczynie problemu.
Możesz tak zrobić, ponieważ język C++ nie przewiduje mechanizmu do automatycznego sprawdzania zakresu tablic. Programista sam musi pilnować, żeby nie nadpisać jakichś "cudzych" danych przy posługiwaniu się "gołymi" tablicami.
I mowa tutaj o rdzeniu języka - bo biblioteka standardowa ma do zaoferowania kilka fajnych i bezpiecznych kontenerów, jak np. std::vector, który posiada metodę std::vector::at(), która działa jak operator indeksowania, a w razie przekroczenia zakresu rzuca wyjątkiem. Kontener std::vector jest również przystosowany do używania iteratorów, co pozwala tworzyć pętle zakresowe, gdzie nie podajesz explicite liczby elementów, tylko każesz wykonać pętlę "dla wszystkich elementów". Mały przykład:
#include <vector>
#include <iostream>
int main()
{
int n;
std::cout<<"Ile elementow? ";
std::cin>>n;
std::vector<int> tab(n); // tworzysz wektor o nazwie tab, który zawiera n elementów typu int
for(int i = 0; i < n; ++i) // spróbuj zmienić zakres pętli na większy, żeby wyjść poza tablicę
{
std::cin>> tab.at(i);
}
for(auto& element : tab) // pętla zakresowa - "dla każdego elementu wektora tab"
{
std::cout<<element<<' ';
}
return 0;
}
Wektory można rozszerzać w trakcie działania programu, zaś tablic nie - ale to już taka informacja poza konkursem, bo nie o to pytałeś. ;)