在此代码中,我尝试返回一个可以将
ctx.a
添加到传递的参数 x
的函数。
预期的答案是 4,但运行此代码时,它打印出 6。
这里出了什么问题?
我已经尝试过这段代码:
#include <stdio.h>
typedef struct {
int a;
} ctx_t;
typedef void(*with_ctx)(int);
with_ctx create_handler(ctx_t ctx) {
void handler(int x) {
printf("%d\n", ctx.a + x);
}
return handler;
}
int main() {
ctx_t ctx = { .a = 1 };
with_ctx handler = create_handler(ctx);
handler(3);
return 0;
}
C 不支持在函数内部声明函数。发生的情况是,您使用的编译器支持它作为 C 之上的扩展。我认为只有 gcc 支持它。
这里出了什么问题?
接下来发生的事情是变量
ctx
在 return handler;
之后停止 existing。函数在
ctx
结束后,create_handler
内的变量 }
作用域将停止存在。因此调用 handler()
将访问一些未定义的内存区域,即 ctx
used 所在的位置。已经不存在了。
不可能用 C 编程语言创建 lambda。请参阅 有没有办法在 C 中进行柯里化? .