C 在结构中使用函数指针数组时崩溃

C 在结构中使用函数指针数组时崩溃,c,structure,function-pointers,C,Structure,Function Pointers,当我在结构中使用函数指针数组时,程序崩溃 #include <stdio.h> typedef void (*FUNCPTR)(void); void Function_1() { printf(" In Function_1 \n"); } void Function_2() { printf(" In Function_2 \n"); } typedef struct St_FUNCPTR { FUNCPTR xxx[2]; }ST_FUNCPT

当我在结构中使用函数指针数组时,程序崩溃

#include <stdio.h>

typedef void (*FUNCPTR)(void);

void Function_1()
{
    printf(" In Function_1 \n");
}
void Function_2()
{
    printf(" In Function_2 \n");
}

typedef struct St_FUNCPTR
{
    FUNCPTR xxx[2];  
}ST_FUNCPTR;

FUNCPTR fnptr1[2] =
{
    Function_1,
    Function_2
};

ST_FUNCPTR fnptr =
{
    fnptr1 

};

/* The intention is to call Function_1(); through array of function 
   pointers in the structure. */  

int main()
{
    // to call Function_1();
    fnptr.xxx[0]();
    return 0;
}
我的问题在哪里?

我的赌注在这里:

ST_FUNCPTR fnptr =
{
    fnptr1 

};
您要做的是初始化结构,该元素是一个带有数组的数组。fnptr1是指向函数的指针数组。
通过你的编辑,这是肯定的。不能像不能说int a1[10]=int b[10]那样用另一个数组初始化数组。
需要澄清的是:fnptr1这里是指向函数指针的指针常量。顺便说一下,它指向xxx[0]并被转换为指向函数的指针

代码接下来做什么,它获取指针的地址,
fnptr.xxx[0]
,将其视为指向函数的指针,并使用()调用它。但是该地址下没有函数,只是指向该函数的指针,因此出现了崩溃。

我希望您的实际代码比这更复杂,由于
St_FUNCPTR
结构似乎不必要地使事情复杂化,您可以通过直接使用
fnptr1
来完成完全相同的事情。应该有一个编译器警告,说明初始值设定项中使用了错误类型的指针。不要忽视警告!如果你要问关于代码的问题,你应该经常提到你得到了什么警告——特别是如果你不明白为什么会得到警告的话。@Zubergu是的,有警告说从不兼容的指针类型初始化[默认启用]|理解了Zubergu文章中解释的问题。但我不明白同一个语句的另一个警告警告:初始化器周围缺少大括号[-Wmissing brates]|查看您的工作初始化器如何
ST_FUNCPTR fnptr={{Function_1,Function_2}有两级大括号?而产生警告的那个只有1级?外大括号表示结构,内大括号表示数组。省略大括号是允许的,但通常不是一个好主意。这就是为什么它警告你。@ Wuppsq.WabrLee考虑将这些评论贴在问题和代码的作者身上。
ST_FUNCPTR fnptr =
{
    fnptr1 

};