C语言中的函数指针数组

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))’

1
你应该为那个数组分配一些空间... - Carl Norum
7个回答

7
您声明的函数需要以int作为参数:
a[0](1);

还要注意,你在函数中声明了一个指向指针的指针,但是你没有为它们分配任何内存(我假设这只是一个示例)。否则,它应该是这样的:
void (*a[3]) (int);

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

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
}

也许是 typedef 语句中有错别字,当我编译代码时遇到了错误,而 typedef void (*func_pointer)(int); 可以正常工作。请再检查一下 :)。 - Summer_More_More_Tea

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

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

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);

在任何函数名之前使用地址运算符'&'是多余的。


1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接