Неожиданное возвращаемое значение функции, вызываемой указателем функции - PullRequest
0 голосов
/ 17 февраля 2019

Возвращаемое значение функции "fun" неожиданно

Я изучаю C, написав функцию высокого порядка "funfun", которая возвращает функцию "fun"

#include<stdio.h>
void* funfun(const int k) {
    int fun(const int c) {
            //int sum = k + c;
            printf("k = %d, c = %d, sum = %d\n", k, c, k + c);
            return k + c;
    }
    return fun;
}

int main() {
    int (*ptr)(int) = funfun(3);
    printf("%d\n", ptr(2));
    return 0;
}

Закомментируя "int sum = k + c;", отображение неожиданно:

k = 3, c = 2, sum = 5
134513986

При сохранении этой строки ожидается отображение:

k = 3, c = 2, sum = 5
5

Код скомпилирован и выполненс:

gcc a.c -o a && ./a

gcc -v показывает:

gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)

1 Ответ

0 голосов
/ 17 февраля 2019

Вы используете расширение GCC, которое называется Вложенные функции .

В этой документации вы можете обнаружить, что то, что вы делаете, запрещено:

Но этот метод работает только до тех пор, пока содержащая функция (в данном примере хак) не завершится.

В вашем случае "содержащая функция" равна funfun.

Если вы попытаетесь вызвать вложенную функцию через ее адрес после выхода из содержащей функции, все прервутся ады .

C на самом деле не имеет функций высшего порядка (с замыканиями и т. Д.).Это расширение для C на самом деле тоже не обеспечивает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...