3

我想创建一个函数指针数组并能够在 for 循环中调用它们。我怎样才能做到这一点?我试过了:

void (**a) (int);
a[0] = &my_func1;
a[1] = &my_func2;
a[2] = &my_func3;

for ( i = 0; i < 3; i++){
    a[0]();
    (*a[0])(); // Neither does work
}

但是我想我缺少一些语法:

error: too few arguments to function ‘*(a + (long unsigned int)((long unsigned int)i * 8ul))’
4

7 回答 7

7

您声明的函数应采用 int 作为参数:

a[0](1);

另请注意,您为函数声明了一个指向指针的指针,但您没有为它们分配任何内存(我假设这仅在示例中)否则它可能应该是:

void (*a[3]) (int);
于 2012-05-19T15:00:33.087 回答
3

您声明这a是一个指向(或指向的指针数组)一个以 anint作为参数的函数的指针 - 因此您需要在调用函数时传递一个 int ,例如a[0](42);.

于 2012-05-19T15:00:21.997 回答
2

我想下面的代码是你需要的。

typedef void * func_pointer(int);

func_pointer fparr[10];

for(int i = 0; i<10; i++)
{
     fparr[i](arg); //pass the integer argument here
}
于 2012-05-19T15:01:47.887 回答
1

1)您在哪里分配或定义了数组来存储函数地址?

2) 在循环中你总是调用 (*a[0])();,应该有循环计数器

于 2012-05-19T15:01:05.437 回答
1

你可以typedef void (*pfun)(int);然后pfun a[3];就是你想要的数组。

以下代码可能对您有用:

typedef void (*pfun)(int);

int main() {
    pfun a[3];
    a[0] = myfunc1;    // or &myfunc1 whatever you like
    a[1] = myfunc2;
    a[2] = myfunc3;
}
于 2012-05-19T15:03:00.983 回答
1

你忘了给你的函数一个参数。

void (**a) (int); // here it takes an int argument
a[0] = &my_func1;
a[1] = &my_func2;
a[2] = &my_func3;

for ( i = 0; i < 3; i++){
    a[0](); // here you do not give an argument
}

但是要小心,你没有为你的a数组分配内存,它会因为一个很好的分段错误错误而失败。

void my_func1(int i) {
    ;
}
void my_func2(int i) {
    ;
}
void my_func3(int i) {
    ;
}

int main() {
    void (**a) (int);
    a = malloc(3*sizeof(void*)); // allocate array !
    a[0] = &my_func1;
    a[1] = &my_func2;
    a[2] = &my_func3;

    for (int i = 0; i < 3; i++){
        a[i](1); // respect your own function signature
    }
    free(a); // it's always a good habit to free the memory you take
    return 0;
}
于 2012-05-19T15:05:21.893 回答
1

您可以使用所需的大小定义函数数组,并使用以下函数对其进行初始化:

void my_func1(int x){}
void my_func2(int x){}
void my_func3(int x){}

void (*a[])(int)={my_func1,my_func2,my_func3};


int i;
for(i=0;i<sizeof a/sizeof*a;++i)
  a[i](i);

任何函数名之前的地址运算符“&”都是多余的。

于 2012-05-19T15:19:59.210 回答