Это потому, что массив i[2]
является локальным для функции initj()
. Следовательно, когда функция возвращается, она больше не действительна. Таким образом, указатель j
становится висящим указателем.
Итак, вы вызвали неопределенное поведение.
Что касается того, почему эти две строки ведут себя так, как они:
Serial.println(j[0]); //111 -> right
Serial.println(j[0]); //768 -> wrong!
Несмотря на то, что значения потеряны, они все еще находятся в стеке. Поэтому, когда вы обращаетесь к нему до вызова Serial.println
, вы получаете «правильное» значение. Но этот вызов функции приводит к перезаписи стека. Таким образом, при втором вызове он дает неправильное значение.
Но в любом случае это все еще неопределенное поведение. Все может допускаться.
Чтобы исправить это, вам нужно поместить значения в область видимости функции setup()
. Вы можете объявить i[2]
глобально или в setup()
и передать его в функцию initj()
.
Вы также можете динамически распределять массив в динамической памяти с помощью malloc()
. (и обязательно освободите его позже с free()
)