@gd1xza

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

В 1 видео на ютубе видел что нельзя создать массив из функций а только из указателей на них. Почему?
  • Вопрос задан
  • 126 просмотров
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Сначала нужно понять, что вообще есть функция? Это тупо кусок машиного кода, который берет какие-то параметры из стека/регистров, создает локальные переменные на стеке, что-то делает и в итоге возвращается командой ret (которая берет адрес возврата из стека).

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

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

Поэтому можно хранить только указатели на функции. Ну, или их можно обернуть в какой-то класс. Или использовать лямбды, но глубоко внутри это все все-равно превратится в указатели на функции.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@dmtrrr
Backend developer
А что ты понимаешь под хранением функции в массиве? Указателя ведь достаточно, чтобы вызвать функцию.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы