首页 > 解决方案 > 函数指针调用的函数的意外返回值

问题描述

函数“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)

标签: c

解决方案


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

在该文档中,您会发现您正在做的事情是不允许的:

但这种技术只有在包含函数(本例中为 hack)不退出时才有效。

“包含功能”funfun在您的情况下。

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

C 并没有真正的高阶函数(带有闭包等)。这个对 C 的扩展并没有真正提供这些。


推荐阅读