Если вы определите массив следующим образом:
int somearr[3];
Вы получаете массив, который имеет 3 элемента. Индексы начинаются с 0, поэтому эти элементы:
somearr[0]
somearr[1]
somearr[2]
Массивы и другие переменные, определенные внутри функции, как в вашем коде, размещаются в стеке. Так получилось, что переменные x и y помещаются в стек рядом с вашим массивом. Если вы пытаетесь получить доступ к элементам
tcodes[3][0] or tcodes[3][1]
Вы получаете доступ к части стека, которая находится за вашим массивом, и, как показывают ваши выходные данные, это место, где расположены переменные x и y.
На самом деле такое определение
signed int tcodes[3][1];
создает массив, содержащий 3 элемента, каждый из которых тоже является массивом - массивом, содержащим один со знаком int. Когда вы пишете tcodes [1] [1], вы получаете доступ к несуществующему «второму» элементу вашего второго массива. Место в памяти, к которому компилятор обращается при интерпретации tcodes [1] [1], перекрывается с tcodes [2] [0];