Because C/C++ doesn't check bounds.
Arrays are internally pointers to a location in memory. When you call arr[index]
what it does is:
type value = *(arr + index);
The results are big numbers (not necessarily) because they're garbage values. Just like an uninitialized variable.