Почему в си нельзя хранить функции в массиве?
===============================================

 В 1 видео на ютубе видел что нельзя создать массив из функций а только из указателей на них. Почему? 

 Сначала нужно понять, что вообще есть функция? Это тупо кусок машиного кода, который берет какие-то параметры из стека/регистров, создает локальные переменные на стеке, что-то делает и в итоге возвращается командой ret (которая берет адрес возврата из стека).  

  

В современных системах для безопасности нельзя просто так взять и исполнить машинные команды, созданные в памяти. Исполняемый код и данные хранятся отдельно. Выполняются только команды, которые записаны в исполнителном файле и загруженны в специальную область памяти, куда нельзя писать (чтобы вирусы не могли переписывать код программы на лету). На самом деле это все можно сделать, но для этого надо совершить какие-то дополнительные действия, которые вам слишком сложны да и не нужны совсем.  

  

Поэтому, как можно хранить функцию в массиве? Массив хранится в переписываемой области памяти, где и все другие переменные. Конечно, можно код функции туда скопировать, но зачем вам этот набор байт, который нельзя исполнить? Написанная вами функция уже хранится в исполняемой области памяти, загруженная туда системой прямо из испоняемого файла. Ее нельзя перемещать и совершенно бесполезно копировать.  

  

Поэтому можно хранить только указатели на функции. Ну, или их можно обернуть в какой-то класс. Или использовать лямбды, но глубоко внутри это все все-равно превратится в указатели на функции. 

 А что ты понимаешь под хранением функции в массиве? Указателя ведь достаточно, чтобы вызвать функцию.