Стив, у вас совершенно неправильная ментальная модель того, что такое функция C.
someType resultFunc = calloc( 1024, 1 );
memcpy( resultFunc, &isNot, 1024 );
Из вашего фрагмента кода я могу предположить, что вы думаете, что можете скопировать скомпилированный код функции в блок памяти, а затем использовать его повторно. Подобные вещи пахнут Лиспом, но даже в Лиспе вы так не делаете.
На самом деле, когда вы говорите «& isNot», вы получаете указатель на функцию. Копирование памяти, на которую указывает указатель, является контрпродуктивным - память была инициализирована при загрузке исполняемого файла в память, и она не меняется. В любом случае, написание someFunc () вызовет дамп ядра, так как динамическая память, которую выполняет someFunc, не может быть выполнена - это защищает вас от всех видов вирусов.
Кажется, вы ожидаете реализацию замыканий в C. Этой реализации просто нет. В отличие от Lisp, Perl или Ruby, C не может сохранить элементы фрейма стека после выхода из этого фрейма. Даже если вложенные функции разрешены в некоторых компиляторах, я уверен, что вы не можете ссылаться на неглобальные переменные внутри этих функций. Закрытие для замыканий - это действительно объект C ++, который хранит состояние и реализует operator (), но это совершенно другой подход, и вам все равно придется делать это вручную.
Обновление: здесь - соответствующая часть документации GCC. Ищите «Но этот метод работает только до тех пор, пока содержащая функция (в данном примере хак) не завершится».