C语言调用嵌套函数

时间:2016-09-25 20:35:34

标签: c gcc

我知道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();
};

1 个答案:

答案 0 :(得分:0)

不允许指向内部函数的指针转义它们在其上创建的堆栈帧。这会产生不确定的行为。

生成的代码在堆栈上放置了一个蹦床。使用您创建的特定构造,第一次调用函数时蹦床被覆盖,因此在第二次调用函数时失败了。

我个人感到恼火的是,它会调用那种没有关闭的行为来关心,但这就是它的作用。哦等等我明白了。你的例子是有效的,因为在将它配对到目前为止,你不小心将它简化为工作代码(参见acorngal'评论)。您的真实代码访问指向标记为a的结构的指针,因此会强制关闭并因此强制执行蹦床。你不能用C做这个特技;在进行OO编程时,您必须自己将等效项传递给$totalImages = $filesCount["jpg"] + $filesCount["gif"] + ... 指针。