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



函数"娱乐"的返回值是出乎意料的

我正在通过编写高阶函数" 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的扩展名也没有真正提供。

最新更新