打印函数指针时出现不兼容的指针类型警告
Incompatible pointer types warning when printing function pointers
我正在尝试创建一个函数指针数组,以便我可以使用指针打印出函数的输出。 (对于 Effective C 书中的练习。)
#include <stdio.h>
#include <stdlib.h>
int a(void) { return 1; }
int b(void) { return 2; }
int c(void) { return 3; }
int main(void)
{
int(*func_arr)[3] = {&a, &b, &c};
printf("%d\n", (*func_arr)[0]);
}
但是,当我编译它时,我收到了警告
starting.c:10:26: warning: incompatible pointer types initializing 'int (*)[3]' with an expression of type
'int (*)(void)' [-Wincompatible-pointer-types]
int(*func_arr)[3] = {&a, &b, &c};
^~
starting.c:10:30: warning: excess elements in scalar initializer
int(*func_arr)[3] = {&a, &b, &c};
^~
而且,当我 运行 程序时,我得到 -443987883 的输出,而它应该只是 1。
有人知道解决办法吗?谢谢!
这个声明
int(*func_arr)[3] = {&a, &b, &c};
声明一个指向数组类型的指针int[3]
。
因此声明了一个指针类型的标量对象,您正尝试使用大括号括起来的初始化器列表进行初始化,其中包含多个不兼容指针类型的初始化器。
你需要写成
int ( *func_arr[3] )( void ) = { a, b, c };
用作初始值设定项的函数指示符被隐式转换为指向函数的指针。
所以没有必要像 &a
这样写,尽管这样的表达式也可以用作初始值设定项。
为了简化数组声明,您可以为函数指针类型引入类型化名称。
例如
typedef int ( *FnPtr )( void );
现在数组声明可以如下所示
FnPtr func_arr[3] = { a, b, c };
要输出函数调用的结果,您需要编写 printf
的调用,例如
printf("%d\n", func_arr[0]() );
我正在尝试创建一个函数指针数组,以便我可以使用指针打印出函数的输出。 (对于 Effective C 书中的练习。)
#include <stdio.h>
#include <stdlib.h>
int a(void) { return 1; }
int b(void) { return 2; }
int c(void) { return 3; }
int main(void)
{
int(*func_arr)[3] = {&a, &b, &c};
printf("%d\n", (*func_arr)[0]);
}
但是,当我编译它时,我收到了警告
starting.c:10:26: warning: incompatible pointer types initializing 'int (*)[3]' with an expression of type
'int (*)(void)' [-Wincompatible-pointer-types]
int(*func_arr)[3] = {&a, &b, &c};
^~
starting.c:10:30: warning: excess elements in scalar initializer
int(*func_arr)[3] = {&a, &b, &c};
^~
而且,当我 运行 程序时,我得到 -443987883 的输出,而它应该只是 1。
有人知道解决办法吗?谢谢!
这个声明
int(*func_arr)[3] = {&a, &b, &c};
声明一个指向数组类型的指针int[3]
。
因此声明了一个指针类型的标量对象,您正尝试使用大括号括起来的初始化器列表进行初始化,其中包含多个不兼容指针类型的初始化器。
你需要写成
int ( *func_arr[3] )( void ) = { a, b, c };
用作初始值设定项的函数指示符被隐式转换为指向函数的指针。
所以没有必要像 &a
这样写,尽管这样的表达式也可以用作初始值设定项。
为了简化数组声明,您可以为函数指针类型引入类型化名称。
例如
typedef int ( *FnPtr )( void );
现在数组声明可以如下所示
FnPtr func_arr[3] = { a, b, c };
要输出函数调用的结果,您需要编写 printf
的调用,例如
printf("%d\n", func_arr[0]() );