Прежде всего, процитируем C11
главу §6.8.6.4, return
утверждение ( выделено мной )
Если выполняется return
инструкция с выражением, значение выражения возвращается вызывающей стороне как значение выражения вызова функции.
Возврат структурной переменной возможен (и верен), поскольку возвращается структурное значение . Это похоже на возврат любого примитивного типа данных (например, возврат int
).
С другой стороны, если вы возвращаете массив с помощью return <array_name>
, он по существу возвращает адрес первого элемента массива ПРИМЕЧАНИЕ. , который становится недействительным для вызывающей стороны, если массив был локальным для вызываемых функций. Таким образом, возврат массива таким способом невозможен.
Так, TL; DR , нет ничего особенного с struct
с, специальность в массивах .
ЗАМЕТКА:
C11
Снова цитируя главу §6.3.2.1 ( выделено мной )
За исключением случаев, когда это операнд sizeof
оператора, _Alignof
оператора или унарного &
оператора, или строковый литерал, используемый для инициализации массива, выражение, имеющее тип "массив типа", преобразуется в выражение с типом " указатель на тип '', который указывает на начальный элемент объекта массива и не является lvalue. [...]
union
. Что особенного в союзах?