Беда в том, что деклараторы массива могут не иметь неполного типа в качестве типа элемента (C11 6.7.6.2/1). И t_yash
(т. Е. struct yhash_s
) не завершено до закрывающей скобки определения структуры.
Это правило также отвечает за еще одну мелочь; допустимо иметь (до завершения определения структуры):
void func( t_yhash *a );
, но не разрешено иметь:
void func( t_yhash a[] );
, даже если правило корректировки будет работать нормально, если бы не правило неполного типа элемента.
Возможно, дизайн языка можно немного улучшить, доработав это правило, чтобы разрешить некоторые случаи, такие как прототип функции, но это явно не было тем, что возникло в комитете по разработке языка.
Но даже без этого правила ваш вариант использования может иметь другую проблему; размер указателя может быть неизвестен. Было бы законно (хотя и маловероятно на практике), чтобы «указатель на массив структуры X» имел другой размер, чем «указатель на массив структуры Y». Существует правило, что все указатели на структуру должны иметь одинаковый размер, но такого правила для указателей на массив не существует.