typedef的函数指针

时间:2011-03-25 12:58:10

标签: c

#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;
}

我无法得到我想要的东西。 结果是“a为0”。 为什么会这样?

4 个答案:

答案 0 :(得分:4)

我认为你很幸运得到a is 0而不是崩溃。问题是getfunc按值获取函数指针,因此myfunc = &add内的getfunc根本不会影响调用者。尝试

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

并在主要:

getfunc(&myfunc);

答案 1 :(得分:2)

这里没有问题,但你需要传递地址,而不是价值。问题似乎是getfunc(myfunc);

将getFunc修复为:

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

并使用getFunc(&myfunc);

进行调用

答案 2 :(得分:1)

应该更像这样(用<<<标记的更改):

#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;
}

答案 3 :(得分:1)

myfunc是一个指针。您创建了它但从未为其分配值。然后用野指针调用getfunc

试试这个(你的版本,简化版):

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

int main()
{
        func myfunc = NULL;
        getfunc(&myfunc);
}