Похоже, что то, что вы ищете, невозможно.
Я не могу использовать динамический c выделение памяти
Для меня это звучит как компилятор- сгенерированный код не может использовать динамическое выделение памяти (куча). Тогда единственное место, где вы можете сохранить весь результат - это стек звонящего. Размер стека должен быть известен во время компиляции.
Возможным решением может быть возвращение массива с заранее заданным размером и размером фактических данных. Например,
fn generate_data() -> ([i32; 50000], usize)
Или вы можете выделить память в стеке вызывающей стороны и затем предоставить ссылку на функцию генерации данных:
fn generate_data(out: &mut [i32; 50000]) -> usize
В противном случае, если вы в порядке с распределением кучи сгенерированным компилятором кодом тогда неясно, почему вы не можете использовать динамические c выделения самостоятельно.