Размер struct
должен определяться во время компиляции, чтобы компилятор знал, как работать с типом. Таким образом, попытка использования динамического значения для объявления массива в нем будет незаконной.
Массив, который вы объявили в теле функции, создается во время выполнения стека, поэтому ему разрешено иметь переменный размер.