Уникальная и часто сбивающая с толку особенность C (и унаследованная C ++) заключается в том, что массив при использовании в выражении рассматривается не как набор значений, а (в большинстве случаев) как указатель на его первый элемент. † Итак, когда вы возвращаете массив из функции, вы возвращаете адрес ее первого элемента.
Разыменование адреса объекта с автоматическим хранением продолжительностито, что больше не находится в области видимости, приводит к неопределенному поведению.
Когда вы возвращаете значение из функции, копия значения возвращается вызывающей стороне.
Таким образом, когда вы возвращаете целое число, вызывающая сторона получает копию этого целочисленного значения.
Если значение является указателем, скопированное значение является указателем. Если указатель указывает на недопустимый объект, то если получатель указателя попытается разыменовать значение указателя, это приведет к неопределенному поведению.
† Есть 3 исключения: (1) в качестве операнда для &
;(2) как операнд к sizeof
;и (3) строковый литерал, используемый для инициализации массива. В C ++ есть и другие исключения: (4) в качестве операнда decltype
;(5) в качестве аргумента функции для ссылочного параметра;(6) Объект для инициализации ссылочной переменной;... наверное, что-то еще, что я забыл ...