Это потому, что:
static int arr[] = {4, 5, 6};
создает массив static
(очевидно), определяемый как переменная, которая существует с момента ее создания до выхода из программы.
С другой стороны:
int arr[] = {4, 5, 6};
создает переменную, которая существует только в пределах ограниченной области функции (или блока), в которой она определена. Он перестает быть при выходе из функции.
В обоих случаях return arr
возвращает адрес первого элемента этого массива. К сожалению, с не static
вариантом, нет правильного способа использовать этот адрес, потому что базовый объект, на который он ссылается, перестал быть. Следовательно, он будет жаловаться на это.
Версия static
, сохраняющаяся до завершения программы, может использоваться после выхода из функции.