Это не ошибка, это просто язык низкого уровня. Вы (почти) не можете разместить массив в стеке и вернуть его в той же функции - пока вы не один из (не) счастливчиков. Но также вы не должны вызывать malloc в любой ситуации.
Чтобы сделать вашу программу дружественной к памяти, выделите этот массив в стеке в вызывающей программе и передайте его в качестве аргумента.
Функция GetTopTen будет выглядеть так:
void GetTopTen(Gene* genes) {
/*
Do something
Do not allocate new Gene array, you already have one - modify values at "genes" pointer
*/
}
Назовите это:
Gene genes[10];
GetTopTen(genes);
/*
Now, do whatever you want with top ten "genes", which are safe until return from this function
*/
Этот стиль, как я вижу в настоящее время, не используется, и очень жаль, что я не шучу, потому что это то, чем низкоуровневые языки отличаются от них с сборкой мусора, и также намного быстрее, чем вызов malloc()
все время; эти переменные автоматически освобождаются и занимают меньше памяти. Но обратите внимание, что он зависит от размера структуры и количества элементов - если он действительно большой, выделите его через malloc, иначе вы можете получить переполнение стека.