函数指针调用的函数的意外返回值

时间:2019-02-17 09:31:44

标签: c

函数“ fun”的返回值是意外的

我正在通过编写高阶函数“ funfun”以返回函数“ fun”来学习C

#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)

1 个答案:

答案 0 :(得分:2)

您正在使用名为Nested Functions的GCC扩展名。

在该文档中,您可以发现不允许您执行操作:

  

但是这种技术只有在包含功能(在此示例中为hack)没有退出的情况下才有效。

根据您的情况,“包含函数”为funfun

  

如果您在包含函数退出后尝试通过嵌套函数的地址调用嵌套函数,则所有地狱都会崩溃

C确实没有高阶函数(带有闭包等)。对C的扩展也没有真正提供这些功能。