В C доступ к массиву вне его границ - это неопределенное поведение .
Это означает, что может произойти что угодно , включая программу, которая ведет себя так, как вы этого ожидаетеto.
Язык C не требует проверки границ при доступе к массиву, и большинство компиляторов C не реализуют его.
Например, предположим, что вы объявляете:
int before;
int array[10];
int after;
Порядок, в котором они хранятся в памяти, не определен, но предположим, что они хранятся непрерывно в том порядке, в котором они объявлены.Если вы попытаетесь получить доступ к array[-1]
, вы можете получить доступ к before
.Если вы попытаетесь получить доступ к array[10]
, вместо этого вы можете получить доступ к after
.
На программиста ложится бремя избегать доступа к массивам за их пределами.Или не может быть ничего выделено до и / или после вашего массива.
Аналогия: «Знак говорит, что мне разрешено переходить улицу только тогда, когда свет зеленый. Я пересек красный и ничегослучилось. Почему машина не ударила меня? "(Есть языки, которые делают все возможное, чтобы заставить машину сбить вас. C не один из них.)