C中具有不同返回类型和参数的函数指针数组
我有3个具有不同返回类型和不同参数的函数。我试图创建一个函数指针数组,然后调用它们。但它不起作用。请提供一些建议C中具有不同返回类型和参数的函数指针数组,c,function-pointers,C,Function Pointers,我有3个具有不同返回类型和不同参数的函数。我试图创建一个函数指针数组,然后调用它们。但它不起作用。请提供一些建议 #include <stdio.h> /* Array of function pointers (different return types and parameters) */ void sayHello() { printf("Hello World\n"); } int add(int a, int b) { return a+b; }
#include <stdio.h>
/* Array of function pointers (different return types and parameters) */
void sayHello()
{
printf("Hello World\n");
}
int add(int a, int b)
{
return a+b;
}
int twice(int a)
{
return 2*a;
}
int main()
{
int choice;
int(*add_ptr)(int,int) = NULL;
void(*hello_ptr)(void) = NULL;
int(*twice_ptr)(int) = NULL;
void * func_table[] = {(void *)sayHello, (void *)add, (void *)twice};
printf("Add : %d\n", ((add_ptr)func_table[1])(10,5));
printf("Hello : \n",((hello_ptr)func_table[0])());
printf("Twice : %d\n",((twice_ptr)func_table[2])(10));
return 0;
}
似乎您希望
add_ptr
、hello_ptr
和tweep_ptr
成为函数指针类型(因为您正在强制转换它们),而不是变量:
typedef int(*add_ptr)(int,int);
typedef void(*hello_ptr)(void);
typedef int(*twice_ptr)(int);
或者,如果要将添加\u ptr
、你好\u ptr
和两次\u ptr
作为变量,并将函数表的元素分配给这些变量,则:
add_ptr = func_table[1];
hello_ptr = func_table[0];
twice_ptr = func_table[2];
printf("Add : %d\n", add_ptr(10,5));
printf("Hello : "); hello_ptr();
printf("Twice : %d\n", twice_ptr(10));
此外,您不需要在此处强制转换为void*
:
void * func_table[] = {sayHello, add, twice};
此外,零参数函数sayHello
和main
在其参数列表中缺少关键字void
。它们应该是这样的:
void sayHello(void) { … }
int main(void) { … }
“但它不起作用”-请解释什么不起作用。您只能强制转换为类型而不是变量<代码>INTA;printf(“%d\n”,(int)3.14)
将编译并输出3
但INTA;printf(“%d\n”,(a)3.14)代码>不会。函数指针不一定适合void*
。因此,出于可移植性的原因,代码具有未定义的行为-UB。建议使用union
而不是void*
。我投票重新打开这个问题,因为(现在)问题非常清楚,应该给用户一个正确的答案。是的。是否需要typedef
?为什么?我很困惑……typedef void(*hello_ptr)(void)代码>应该是typedef void(*hello_ptr)()代码>,对吗?@CoolGuy它应该是带有void
。sayHello
和main
的声明在它们的参数列表中丢失了void
。@InsaneCoder是因为您想将add_ptr
(等)声明为类型,而不是变量。或者,您可能只想将func\u表[1]
分配给add\u ptr
变量。其语法为add_ptr=func_table[1]代码>@tuple\u cat是。那也行。我建议在你的回答中提及这一点。
void * func_table[] = {sayHello, add, twice};
void sayHello(void) { … }
int main(void) { … }