[英]C language. Strange function behavior
所以我正在編寫一個生成函數的程序。 我正在用GCC嵌套函數模擬lambda表達式。 但是我遇到了奇怪的程序動作。 也許我不了解這背后的理論,女巫帶領我的程序進行奇怪的動作。 在這里,我編寫了非常簡化的代碼,下面指出了問題所在。 該程序應該只打印N次'1337',但是該程序只打印一次並且發瘋。
#include <stdio.h>
#include <stdlib.h>
#define lambda(return_type, function_body) \
({ \
return_type __fn__ function_body \
__fn__; \
})
void init(void (**fn)()){
int num = 1337;
*fn = lambda(void,(){printf("%d\n",num);});
}
int main(){
void (*fn)();
init(&fn);
fn(); // Everything is fine, it prints '1337'
fn(); // It prints '-1869573949' , maybe accessing memory somewhere
fn(); // It does not print anything at all
... // It does not print anything at all
return 0;
}
我想指出的是,如果我改變
void init(void (**fn)()){
int num = 1337;
*fn = lambda(void,(){printf("%d\n",num);});
}
至
void init(void (**fn)()){
*fn = lambda(void,(){printf("%d\n",1337);});
}
它有效,但是不能滿足我的需求。
感謝您提供有關此問題的幫助或信息,因為我對此非常感興趣。
正如GCC的嵌套函數文檔中所述:
如果您嘗試在包含函數退出后通過其地址調用嵌套函數,那么所有地獄都會變得松散。 如果您嘗試在包含作用域級別退出之后調用它,並且如果它引用了不再在作用域中的某些變量,則可能很幸運,但是冒險是不明智的。
換句話說,您在此處嘗試做的事情-返回對嵌套函數的引用-並未真正受到GCC的認可。 無論它在何種程度上正常運行,您都非常幸運,因為GCC並不意味着支持此功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.