Массивы в C не проверяются во время выполнения. Другими словами, вы можете «определить» массив размера N и счастливо получить доступ к концу границы массива. Если вы уйдете с конца массива, вы будете удалять память где-нибудь в стеке (или в кучу).
Как только вы где-нибудь храните память, ваша программа, скорее всего, выйдет из строя. Эти сбои могут быть трудно отследить, потому что они могут упасть далеко от того места, где вы на самом деле перекрыли конец массива.
Обычно при объявлении массивов в C, то лучше использовать какое-то постоянная или #define, чтобы отметить размер массива:
#define MAX_ELEMENTS 10
int array[MAX_ELEMENTS];
int cnt;
for(cnt = 0; cnt < MAX_ELEMENTS; cnt+=1) {
array[cnt] = cnt;
}
Если пройти MAX_ELEMENTS в назначении массива, вы могли бы перезаписать значение cnt.Вы можете перезаписать другую переменную. Все зависит от компилятора и структуры кода. Также обратите внимание на использование знака < в цикле for. C массивы основаны на 0, поэтому вам нужно проверить, используя меньше, а не меньше или равно.
+1 для предотвращения носового демона! – RBerteig
@RBerteig: Я не думаю, что «defenestration» (defenstration - это не слово) означает, что вы думаете, что это значит. По-английски это было бы тем, что кто-то бросал кого-то через окно. http://en.wikipedia.org/wiki/Defenestration –
Опечатка, действительно, но выбор слова был преднамеренным. Я стремился к чему-то, что вселилось в «демона», которое имело правильное количество неожиданного изгнания. Это было растяжкой и, возможно, пробив точку метафоры ;-) – RBerteig