Я знаю, что C не поддерживает вложенные функции, и это только расширение gcc. Но даже в этом случае это поведение странно.C-вызов вызова вложенной функции
Кажется, что вложенные функции можно вызвать только один раз; второй вызов вызывает SIGSEV, а иногда и SIGILL. Мне нужны вложенные функции для таких структур, как stack. В стеке я мог бы определить такие функции, как pop, push и т. Д., Которые я буду назначать с помощью вложенных функций, которые вызовут нормальные функции со ссылкой, которые я получу. Эта функция похожа на конструктор или инициализатор. Но этого кода достаточно, чтобы смоделировать мою проблему.
При генерации функции присваивает innerFunction в struct, второй вызов вызывает ошибку. Если назначение - проверить функцию, второй вызов - это нормально.
В чем проблема, пожалуйста? В документации gcc говорится, что до тех пор, пока у вас есть внутренний адрес функции, вы можете получить доступ к этой функции, а вложенная функция имеет доступ ко всем указанным выше переменным.
typedef struct A A;
struct A {
void (*foo)();
};
void test() {
printf("test\n");
}
void generate(A* a) {
void innerTest(){
test();
}
a->foo = &innerTest;
}
int main() {
A a;
generate(&a);
a.foo();
a.foo();
};
В чем проблема? Я правильно скомпилировал и выполнил ваш код. – acornagl
Я считаю, что вложенные функции не соответствуют друг другу. Даже если он может работать –
В документации [https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html#Nested-Functions] фактически говорится: «Если вы пытаетесь вызвать вложенную функцию по ее адресу после того, как функция сложения выходит, все ад разрывается. * « – melpomene