указатель на функцию typedef - PullRequest
1 голос
/ 25 марта 2011
#include <stdio.h>

typedef int (*func)(int);

int add (int a)
{
        return ++a;
}

int getfunc(func myfunc)
{
    myfunc = &add;
    return 0;
}

int main()
{
        int i;
        func myfunc;

        i = 10;
        getfunc(myfunc);

        printf(" a is %d\n", (*myfunc)(i));

        return 0;
}

Я не могу получить то, что хочу. результат «а равен 0». почему это?

Ответы [ 4 ]

4 голосов
/ 25 марта 2011

Я думаю, вам действительно повезло, что вы получили a is 0 вместо аварии. Проблема в том, что getfunc принимает указатель на функцию по значению, поэтому myfunc = &add внутри getfunc никак не влияет на вызывающего. Попробуйте

int getfunc(func *myfunc)
{
    *myfunc = &add;
    return 0;
}

и в основном:

getfunc(&myfunc);
2 голосов
/ 25 марта 2011

Здесь нет вопросов, но вам нужно пройти по адресу, а не по значению.проблема, кажется, getfunc(myfunc);

Исправьте getFunc на:

int getfunc(func *myfunc)
{
    *myfunc = &add;
    return 0;
}

и вызовите его с помощью getFunc(&myfunc);

1 голос
/ 25 марта 2011

myfunc - указатель. Вы создали его, но никогда не присваивали ему значение. Затем вы звоните getfunc с диким указателем!

Попробуйте это (ваша версия, упрощенно):

int getfunc(func *myfunc)
{
    *myfunc = add;
    return 0;
}

int main()
{
        func myfunc = NULL;
        getfunc(&myfunc);
}
1 голос
/ 25 марта 2011

Должно быть больше так (изменения помечены <<<):

#include <stdio.h>

typedef int (*func)(int);

int add(int a)
{
    return ++a;
}

func getfunc(void) // <<<
{
    return &add; // <<<
}

int main()
{
    int i;
    func myfunc;

    i = 10;
    myfunc = getfunc(); // <<<

    printf(" a is %d\n", (*myfunc)(i));

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