Прежде всего, механизм указателей на функции C предназначен для абстракции вызова функций с одинаковой сигнатурой. Это достаточно мощный и подвержен ошибкам без этих трюков.
Я не вижу преимущества / смысла в попытке скопировать код из одного места в другое. Как прокомментировали некоторые, нелегко определить количество кода относительности / перераспределения в функции C.
Вы попытались скопировать код функции в область памяти данных. Некоторые микроконтроллеры просто сказали бы: «Отпусти!». На машинных архитектурах, которые имеют память, разделенную данными / программами, при наличии очень понимающего компилятора (или компилятора, который распознает данные / модификаторы / атрибуты кода), он будет компилироваться в конкретные инструкции перемещения кода-данных. Это работает, но это работает ... Однако даже в арках памяти, разделенных данными / кодами, выполнение команд памяти данных невозможно.
С другой стороны, в «обычных» ПК с общей памятью данных / кода, вероятно, это также не будет работать, поскольку сегменты данных / кода объявляются (загрузчиком) в MMU процессора. В зависимости от процессора и ОС, попытки выполнить код на сегментах данных являются ошибкой сегментации.