[英]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.