Переменные, имеющие automatic storage class
(переменные, созданные в функции, кроме static variables
), создаются в стеке в C
языках программирования.
Переменные в вашей программе также создаются в стеке. Поэтому переменные i
, vals[0]
, vals[1]
, vals[2]
, vals[3]
и vals[4]
можно найти в стеке.
Помните: Индексы массивов в C programming language
начинаются с 0
. Если размер массива равен n
, то индексы идут от 0 до (n-1).
Петля for
в вашей программе пытается получить доступ к vals [5], когда ваша индексная переменная достигает 5
. Достижение вне границ массива - это НЕОПРЕДЕЛЕННОЕ ПОВЕДЕНИЕ в C. Результат, который вы видели, является одним из возможных результатов. Так как в вашем стеке не существует vals[5]
, вы можете получить доступ к ячейке памяти, назначенной некоторой другой переменной, которая может быть ячейкой памяти, назначенной переменной i
.Вы даже можете получить Ошибка сегментации, если вы получаете доступ к массиву из его привязки (Как я уже упоминал выше, результат не определен. Программа может работать без какой-либо ошибки сегментации или вы можете получить ее).
Рассмотрим картину, которую я создал:
В вашем случае массив (Vals) и индекс (я) может быть рядом друг с другом в стеке. Таким образом, vals[5] = 0
сбрасывает i до нуля и, следовательно, бесконечный цикл.
Ваш код вызывает [UB] (http://en.cppreference.com/w/cpp/language/ub), 'vals [i]' будет пытаться получить доступ к vals [5] ', который выходит за рамки , – George
Я пробовал ваш код на [Идеал] (http://ideone.com/aAzej4). Он выдавал результат как '6'. –
Это _could_ приводит к бесконечному циклу из-за UB, но это может и не быть. Один из способов может привести к бесконечному циклу, если (a) 'i' хранится сразу после' vals', (b) 0 записывается в место хранения 'i' последней итерацией и (c)' i 'считывается из этого места хранения компилятором при выполнении теста' i <= 5'. –