Cはネストされた関数をサポートしていないことを知っています。しかし、それでも、この動作は奇妙です。ネストされた関数を呼び出すC言語
ネストされた関数は1回しか呼び出せないようです。 2回目の呼び出しでSIGSEVが発生し、時にはSIGILLが発生します。私は、スタックのような構造のネストされた関数を必要とします。スタック上では、pop、pushなどの関数を定義することができます。入れ子関数では、通常の関数を参照で呼び出すことになります。この関数は、コンストラクタまたはイニシャライザと似ています。しかし、このコードは私の問題をシミュレートするのに十分です。
生成関数でinnerFunctionをstructに代入すると、2番目の呼び出しでエラーが発生します。代入が関数をテストするためのものであれば、2番目の呼び出しはOKです。
問題はどこですか? 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