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