函数"娱乐"的返回值是出乎意料的
我正在通过编写高阶函数" funfun"来返回功能"娱乐"
来学习C#include<stdio.h>
void* funfun(const int k) {
int fun(const int c) {
//int sum = k + c;
printf("k = %d, c = %d, sum = %dn", k, c, k + c);
return k + c;
}
return fun;
}
int main() {
int (*ptr)(int) = funfun(3);
printf("%dn", ptr(2));
return 0;
}
评论" int sum = k c;",显示是出乎意料的:
k = 3, c = 2, sum = 5
134513986
保持该行,预期显示:
k = 3, c = 2, sum = 5
5
代码已编译和执行:
gcc a.c -o a && ./a
gcc -v显示:
gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)
您正在使用称为嵌套功能的GCC扩展。
在该文档中,您可以发现您正在做的事情是不允许的:
但是,此技术只有在包含函数(在此示例中进行hack)不退出。
在您的情况下,"包含函数"是funfun
。
如果您尝试通过包含函数退出后通过其地址调用嵌套函数,则所有地狱都松散。
c实际上没有更高阶的功能(带有关闭等)。c的扩展名也没有真正提供。