我知道C不支持嵌套函数,它只是一个gcc扩展。但即便如此,这种行为也很奇怪。
似乎嵌套函数只能被调用一次;第二次调用会导致SIGSEV,有时会导致SIGILL。我想要堆栈等结构的嵌套函数。在堆栈上,我将能够定义pop,push等函数,我将使用嵌套函数分配这些函数,这将使用引用调用普通函数,我将得到它。此函数类似于构造函数或初始化程序。但是这段代码足以模拟我的问题。
当generate函数将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();
};
答案 0 :(得分:0)
不允许指向内部函数的指针转义它们在其上创建的堆栈帧。这会产生不确定的行为。
生成的代码在堆栈上放置了一个蹦床。使用您创建的特定构造,第一次调用函数时蹦床被覆盖,因此在第二次调用函数时失败了。
我个人感到恼火的是,它会调用那种没有关闭的行为来关心,但这就是它的作用。哦等等我明白了。你的例子是有效的,因为在将它配对到目前为止,你不小心将它简化为工作代码(参见acorngal'评论)。您的真实代码访问指向标记为a的结构的指针,因此会强制关闭并因此强制执行蹦床。你不能用C做这个特技;在进行OO编程时,您必须自己将等效项传递给$totalImages = $filesCount["jpg"] + $filesCount["gif"] + ...
指针。