arrays - 打印函数指针时出现不兼容的指针类型警告

标签 arrays c function-pointers declaration function-call

我正在尝试创建一个函数指针数组,以便我可以使用指针打印出函数的输出。 (对于 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]() );

关于arrays - 打印函数指针时出现不兼容的指针类型警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71832355/

相关文章:

C++解析复杂文件,其中每一行指定一个命令

c++ - 函数指针的取消引用是如何发生的?

java - 我如何确定我是否在JAVA中的2D数组的 'edge'上?

ios - 如何判断是否未选择数组中的所有按钮

c - 如何在C中将数组拆分为两个数组

c++ - 如何在不相关的类之间传递 C++ 回调?

python - Objective-C 中常用的数组选项

c - 这个数组定义为静态而不是全局的是什么?

c - 为什么下面的代码中 ceil 返回 0.000?

c - 为什么我得到 "dereferencing pointer to incomplete type"?