我開始學習函數式編程,想看看我是否能在與C.封逃脫爲了再現從Wikipedia - 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, &x);
printf("%d", f(2));
return 0;
}
它被編譯器(gcc 4.8.2。在Ubuntu 14.04上),它工作,打印出來3.由於缺乏我在C領域的專業知識(只有大學的基礎課程),我的問題是,這個代碼有什麼嚴重錯誤?我學會了函數的定義應該是全球性的,我從來沒有期待這個工作......
編輯: 爲什麼它,當我改變這樣的主要功能:
int main()
{
int x = 1;
int(* f)(int);
closure(&f, &x);
printf("%d", f(2));
printf("%d", f(3)); // the only difference
return 0;
}
我得到分割故障?
謝謝你的回覆。我用一個不起作用的示例編輯了一個問題(對不起,以前沒有發佈它)。不應該有一些內存問題,如訪問局域變量超出範圍或類似的東西嗎? –