Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的闭包-这有用吗?_C_Closures - Fatal编程技术网

C语言中的闭包-这有用吗?

C语言中的闭包-这有用吗?,c,closures,C,Closures,我开始学习函数式编程,想看看我是否可以用C语言编写闭包。为了重现第一个示例,我编写了以下代码: #include <stdio.h> void closure (int(** f)(int), int *x) { int fcn(int y) { return *x + y; }; *f = fcn; } int main() { int x = 1; int(* f)(int); closure(&f,

我开始学习函数式编程,想看看我是否可以用C语言编写闭包。为了重现第一个示例,我编写了以下代码:

#include <stdio.h>

void closure (int(** f)(int), int *x) {
    int fcn(int y) {
        return *x + y;
    };
    *f = fcn;
}

int main()
{
    int x = 1;
    int(* f)(int);

    closure(&f, &x);

    printf("%d", f(2));

    return 0;
}

我遇到了分段错误?

您的代码可以工作,因为gcc有一个支持嵌套函数的语言扩展

但是,在标准C中,不能在另一个函数中定义函数

如果您试图在包含函数退出后通过其地址调用嵌套函数,那么所有的麻烦都会发生。如果您试图在包含作用域级别退出后调用它,并且如果它引用了一些不再在作用域中的变量,那么您可能很幸运,但冒险是不明智的。但是,如果嵌套函数未引用超出范围的任何内容,则应该是安全的


首先,您的程序调用未定义的行为。这是因为函数
closure
中定义的函数
fcn
是局部函数<代码>fcn一旦
关闭
返回,就不再存在。因此,
printf
调用

printf("%d", f(2));
通过调用
f(2)
调用未定义的行为,因为
f
指向不在范围内的函数
fcn

C
语言没有闭包,这是因为
C
中的函数不是一级对象。这意味着函数不能传递给其他函数,也不能从函数返回。实际传递或返回的是指向它的指针


请注意,嵌套函数和闭包之间存在差异。您看到的是的GCC扩展。这不是C标准的一部分。

谢谢您的回复。我用一个不起作用的例子编辑了一个问题(很抱歉没有在前面发布)。。是否应该有一些内存问题,比如访问超出范围的局部变量或类似的东西?
printf("%d", f(2));