Где хранится тело вложенной функции? - PullRequest
0 голосов
/ 25 февраля 2020

Пожалуйста, проверьте следующий код,

#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(). Кто-нибудь может дать объяснение этому? Как я могу сохранить время жизни вложенной функции на протяжении всей программы?

1 Ответ

1 голос
/ 25 февраля 2020

Ваша проблема (за исключением нестандартного расширения) заключается в том, что локальная переменная str внутри функции make_adder_function закончила свое время жизни после завершения функции make_adder_function. И это происходит до того, как вы вызовете функцию adder, которая затем попытается использовать несуществующую переменную str.

Расширение для вложенных функций только вложенные функции, оно не имеет закрытие .

...