请检查以下代码,
#include <stdio.h>
#include <string.h>
void* make_adder_function(int a)
{
char str[64] ={};
sprintf(str,"this function adds %d with input",a);
void adder(int b) {
int x = a;
char ptr[64] = {};
strcpy(ptr,str);
printf("%sn", ptr);
printf("%d + %d = %dn", x, b, x+b);
}
return adder;
}
int main()
{
void (*adder_ten)(int);
void (*adder_twenty)(int);
adder_ten = make_adder_function(10);
adder_twenty = make_adder_function(20);
adder_ten(20);
adder_twenty(20);
return 0;
}
在运行代码时,我得到了以下输出,
ajith@chat:~/Desktop$ ./a.out
this function adds 20 with input
20 + 20 = 40
Segmentation fault (core dumped)
这表明function adder()
的范围仅在make_adder_function()
内部,我认为这是因为adder()
的函数体保留在make_adder_function()
的堆栈帧中。有人能对此作出解释吗?如何在整个程序中保持嵌套函数的生命周期?
您的问题(非标准扩展除外(是,当make_adder_function
函数结束时,make_adder_function
函数内的局部变量str
将结束其生命周期。这种情况发生在调用adder
函数之前,该函数然后尝试使用不存在的str
变量。
嵌套函数扩展只嵌套函数,它没有闭包。
作为一个简单的解决方法,您可以将str
设置为static
变量。它的使用寿命将是程序的整个运行时间。那么问题是,只有一个变量,它将在对make_adder_function
函数的所有调用之间共享。