Как и ответ Interjay, упомянутый , как только вы попадаете в неопределенное поведение, все ставки отменяются.Однако, когда вы сказали, что простое переименование переменной изменило поведение программы, мне стало интересно, что происходит (не определено или нет).
Во-первых, я не верил, что переименование переменной изменитсявывод компилятора (при прочих равных условиях), но достаточно точно - когда я попробовал это, я был удивлен, увидев точно то, что вы описали.
Поэтому я заставил компилятор вывести сборку для генерируемого им кодадля каждой версии исходного файла и запускали сравнение.Вот что я нашел в описании компилятора о том, как он выкладывал локальные переменные:
***** test.sizeOfInput.cod
_c$ = -56 ; size = 4
_b$ = -52 ; size = 4
_inner$ = -48 ; size = 4
_a$ = -44 ; size = 40
>>> _sizeOfInput$ = -4 ; size = 4
_main PROC
***** test.sizeOfInputt.cod
_c$ = -56 ; size = 4
>>> _sizeOfInputt$ = -52 ; size = 4
_b$ = -48 ; size = 4
_inner$ = -44 ; size = 4
_a$ = -40 ; size = 40
_main PROC
*****
Что вы заметите, так это то, что когда переменная называется sizeOfInput
, компилятор размещает ее на более высокомадрес, чем массив a
(только после конца массива), и когда переменная имеет имя sizeOfInputt
, она размещает ее по более низкому адресу, чем массив a
, а не только за концом массива.Это означает, что в сборке, которая имеет переменную с именем sizeOfInput
, неопределенное поведение, возникающее при изменении a[10]
, изменяет значение sizeOfInput
.В сборке, которая использует имя sizeOfInputt
, поскольку эта переменная не находится в конце массива, запись в a[10]
перебивает что-то еще.
Относительно того, почему компилятор разместил переменныеиначе, когда имя одного изменяется незначительным образом - я понятия не имею.
Но это хороший пример того, почему вы не должны рассчитывать на расположение локальных переменных (или почти любых переменных,хотя вы можете рассчитывать на порядок расположения элементов структуры), и почему, когда дело доходит до неопределенного поведения, «это работает на моей машине», это не является доказательством того, что что-то работает.