簡體   English   中英

C語言調用嵌套函數

[英]C language calling nested function

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

不允許指向內部函數的指針轉義它們創建的堆棧框架。 這會產生未定義的行為。

生成的代碼在堆棧上放置了一個蹦床。 使用您創建的特定構造,第一次調用函數時蹦床被覆蓋,因此在第二次調用函數時失敗了。

我個人感到惱火的是,它調用了沒有關閉的行為來關心,但這就是它的作用。 哦等等我明白了。 你的例子是有效的,因為在將它配對到目前為止你不小心將它減少為工作代碼(參見acorngal的評論)。 您的真實代碼訪問指向標記為a的結構的指針,因此會強制關閉並因此強制執行蹦床。 你不能用C做這個特技; 在進行OO編程時,您必須自己將等效項傳遞給this指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM