#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». почему это?
Я думаю, вам действительно повезло, что вы получили a is 0 вместо аварии. Проблема в том, что getfunc принимает указатель на функцию по значению, поэтому myfunc = &add внутри getfunc никак не влияет на вызывающего. Попробуйте
a is 0
getfunc
myfunc = &add
int getfunc(func *myfunc) { *myfunc = &add; return 0; }
и в основном:
getfunc(&myfunc);
Здесь нет вопросов, но вам нужно пройти по адресу, а не по значению.проблема, кажется, getfunc(myfunc);
getfunc(myfunc);
Исправьте getFunc на:
и вызовите его с помощью getFunc(&myfunc);
getFunc(&myfunc);
myfunc - указатель. Вы создали его, но никогда не присваивали ему значение. Затем вы звоните getfunc с диким указателем!
myfunc
Попробуйте это (ваша версия, упрощенно):
int getfunc(func *myfunc) { *myfunc = add; return 0; } int main() { func myfunc = NULL; getfunc(&myfunc); }
Должно быть больше так (изменения помечены <<<):
<<<
#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; }