c语言 - 嵌套函数的主体保存在哪里?



请检查以下代码,

#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函数的所有调用之间共享。

相关内容

  • 没有找到相关文章

最新更新