我想创建一个函数指针数组,并能够在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))’
答案 0 :(得分:7)
您声明的函数应该将int作为参数:
a[0](1);
另请注意,您声明了一个指向函数指针的指针,但是您没有为它们分配任何内存(我假设这仅在示例中),否则它应该是:
void (*a[3]) (int);
答案 1 :(得分:3)
您声明a
是指向({或指针数组)指针的指针,该函数以int
作为参数 - 所以当你需要传递一个int时调用函数,例如a[0](42);
。
答案 2 :(得分: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
}
答案 3 :(得分:1)
1)您在哪里分配或定义了数组来存储函数地址?
2)在循环中你总是在调用(* a [0])();,应该有循环计数器
答案 4 :(得分: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;
}
答案 5 :(得分: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;
}
答案 6 :(得分: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);
地址运营商'&amp;'在任何函数名称冗余之前。