Когда и если ваш код падает, не является детерминированным. Это будет зависеть от того, на какой платформе вы запускаете код.
array
- это переменная стека, поэтому ваш компилятор зарезервирует для нее 10 * sizeof(int)
байт в стеке. В зависимости от того, как компилятор упорядочивает другие локальные переменные и как растет ваш стек, i
может прийти сразу после array
. Если вы последуете совету Даниила и вставите оператор printf
, вы можете заметить интересный эффект. На моей платформе, когда i = 10
, array[10] = 22
clobbers i
и следующее назначение - array[23]
.
Нарушение сегментации происходит, когда пользовательский код пытается коснуться страницы, к которой у него нет доступа. В этом случае вы получите один, если ваш стек достаточно мал, чтобы 9999 итераций вышли за пределы стека.
Если вы вместо этого выделили array
в куче (используя malloc()
), тогда вы получите SIGSEGV, когда выйдете за пределы границы страницы. Даже 10-байтовое распределение вернет целую страницу. Размеры страниц зависят от платформы. Обратите внимание, что некоторые отладчики malloc могут попытаться пометить массив как недопустимый, но вы не получите SIGSEGV, если не задействуете аппаратное обеспечение, когда вы запустите конец страницы.