c - 函数指针调用的函数的意外返回值
问题描述
函数“fun”的返回值出乎意料
我正在通过编写一个高阶函数“funfun”来学习 C,以返回一个函数“fun”
#include<stdio.h>
void* funfun(const int k) {
int fun(const int c) {
//int sum = k + c;
printf("k = %d, c = %d, sum = %d\n", k, c, k + c);
return k + c;
}
return fun;
}
int main() {
int (*ptr)(int) = funfun(3);
printf("%d\n", 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)
解决方案
您正在使用名为Nested Functions的 GCC 扩展。
在该文档中,您会发现您正在做的事情是不允许的:
但这种技术只有在包含函数(本例中为 hack)不退出时才有效。
“包含功能”funfun
在您的情况下。
如果你试图在包含函数退出后通过它的地址调用嵌套函数,所有的地狱都会崩溃。
C 并没有真正的高阶函数(带有闭包等)。这个对 C 的扩展并没有真正提供这些。
推荐阅读
- laravel - 文件上传总是在 laravel 中返回 NULL
- html - 页脚图层不显示
- php - 在 Woocommerce 电子邮件通知中将产品名称替换为 SKU
- javascript - 有没有办法从 StackEdits 工具栏中删除 StackEdit 按钮?
- regex - 在 Go 正则表达式中拆分浮点字符串
- python - 如何在第 1 类中更改第 2 类(Tkinter)中的小部件(标签)的属性?
- python - objects.filter by User 只为一个用户过滤数据
- ios - 为什么安装 Stripe pod 并在代码目标 c 中使用 Stripe 后出现 pod 错误?
- android - 关闭 DialogFragment 后面的点击活动?
- swift - 加入 Fluent in Vapor 时崩溃