-1

请检查以下代码,

#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("%s\n", ptr);
        printf("%d + %d = %d\n", 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(). 任何人都可以对此做出解释吗?如何在整个程序中保持嵌套函数的生命周期?

4

1 回答 1

1

您的问题(除了非标准扩展)是函数str内的局部变量make_adder_function将在函数结束时结束其生命周期make_adder_function。这发生在您调用该adder函数之前,然后该函数尝试使用不存在的str变量。

嵌套函数扩展只嵌套函数,它没有闭包

于 2020-02-25T08:56:33.107 回答