我试图创建一个函数指针数组,这样我就可以使用指针打印出函数的输出.(参见有效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 };

用作初始值设定项的函数指示符被隐式转换为指向函数的指针.

为了简化数组声明,可以为函数指针类型引入一个类型化名称.

例如

typedef int ( *FnPtr )( void );

现在,数组声明可以如下所示

FnPtr func_arr[3] = { a, b, c };

要输出函数调用的结果,您需要编写printf个这样的调用

printf("%d\n", func_arr[0]() );

C++相关问答推荐

为什么已经设置的值在C中被重置为for循环条件中的新值?

在C中使用JMP_buf数组进行线程化(在xv6中测试)

为什么在此程序中必须使用Volatile关键字?

正在try 将文件/文件夹名从目录 struct 存储到链接列表

使用GOTO从多个嵌套循环C继续

如何在IF语句中正确使用0.0

为什么GCC在每次循环迭代时都会生成一个数组的mov&S使用[]访问数组?(-03,x86)

为什么STM32G474RE上没有启用RCC PLL

当输入负数时,排序算法存在问题

预先分配虚拟地址空间的区域

如何在STM8项目中导入STM8S/A标准外设库(ST VisualDeveloper)?

GCC奇怪的行为,有fork 和印花,有换行符和不换行符

类型定义 struct 与简单的类型定义 struct

是否定义了此函数的行为?

有没有一种方法可以用C创建保留限定符的函数?

在我的函数中实现va_arg的问题

在哪里可以找到叮当返回码的含义?

C 错误:对 int 数组使用 typedef 时出现不兼容的指针类型问题

在 C/C++ 中原子按位与字节的最佳方法?

char* 上的 free() 被 valgrind 识别为无效