【问题标题】:Crash while using array of function pointers in a structure在结构中使用函数指针数组时崩溃
【发布时间】:2013-09-18 13:47:39
【问题描述】:

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

#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 =
{
    {Function_1,Function_2},
};

我的问题在哪里?

【问题讨论】:

  • 我希望您的实际代码比这更复杂,因为 St_FUNCPTR 结构似乎不必要地使事情复杂化,您可以直接使用 fnptr1 来做完全相同的事情。

标签: c structure function-pointers


【解决方案1】:

我的赌注在这里:

ST_FUNCPTR fnptr =
{
    fnptr1 

};

您要做的是初始化结构,其中元素是带有数组的数组。 fnptr1 是一个函数指针数组。
有了您的编辑,这是肯定的。你不能用另一个数组初始化数组,就像你不能说 int a1[10]=int b[10]。
澄清一下:这里的 fnptr1 是指向函数指针的指针常量。顺便说一下,它转到 xxx[0] 被转换为指向函数的指针。
接下来的代码将获取该指针的地址 fnptr.xxx[0] ,将其视为指向函数的指针并使用 () 调用它。但是那个地址下没有函数,只是指向函数的指针,所以崩溃了。

【讨论】:

  • 应该有一个编译器警告初始化器中使用了错误类型的指针。不要忽视警告!如果您要询问有关您的代码的问题,您应该始终提及您收到了哪些警告 - 特别是如果您不明白为什么会收到这些警告。
  • @Zubergu 是的,有警告说从不兼容的指针类型初始化[默认启用]|理解了 Zubergu 帖子中解释的问题。但不明白同一语句警告的另一个警告:初始化器周围缺少大括号 [-Wmissing-braces]|
  • 看看你的初始化器ST_FUNCPTR fnptr = { {Function_1,Function_2} }; 有两层大括号?而产生警告的只有1级?外大括号表示结构,内大括号表示数组。允许省略大括号,但通常不是一个好主意。这就是它警告你的原因。
  • @WumpusQ.Wumbley 考虑将这些 cmets 发送给问题和代码的作者。
猜你喜欢
  • 2018-01-03
  • 2021-10-12
  • 2021-12-25
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 2018-06-07
相关资源
最近更新 更多