指向函数指针数组的指针调用异常:第27行运行时错误求助
修复函数指针数组调用的运行时错误
你遇到的问题核心是对typedef定义的数组类型的指针操作不当,导致访问了错误的内存地址,触发运行时错误。咱们一步步拆解问题并修复:
问题根源分析
你当前的typedef void (*fPtr[3])(void);定义的是一个包含3个void(*)()函数指针的数组类型,而非单个函数指针类型。这会导致后续的指针操作极易混淆:
- 当你在类里声明
fPtr *_funcAr时,这个变量是指向上述3元素函数指针数组的指针,而不是指向单个函数指针的指针。 - 如果第27行是直接用
_funcAr[index]()调用函数,那实际上是在访问第index个"3元素函数指针数组",而非目标数组里的第index个函数指针,这必然会越界访问错误内存,触发运行时崩溃。
另外你提到改成typedef void (*fPtr[])(void);会编译错误,这是因为C++不允许typedef不完整的数组类型(长度未知的数组属于不完整类型),所以这个写法本身就是非法的。
修复方案
我给你两种修复思路,推荐第二种,因为它的可读性更强:
方案1:修正原有typedef的使用方式
如果你想保留原有的数组类型typedef,需要正确解引用数组指针来访问函数指针:
#include <iostream> void f1 (void) { std::cout << "f1" << "\n"; } void f2 (void) { std::cout << "f2" << "\n"; } void f3 (void) { std::cout << "f3" << "\n"; } // 原typedef:fPtr是包含3个void(*)()的数组类型 typedef void (*fPtr[3])(void); class modeChanger { public: // 构造函数接收fPtr类型的数组(会退化为指向数组的指针) modeChanger(fPtr funcArray) : _funcAr(funcArray) {} void op(int index) { // 先解引用数组指针得到数组,再访问对应索引的函数指针并调用 if (index >=0 && index <3) { // 加上边界检查避免越界 (*_funcAr)[index](); } } private: fPtr _funcAr; // 这里不需要指针,因为fPtr本身是数组类型,会被编译器处理为指针(数组退化为指针) }; int main() { fPtr funcArr = {f1, f2, f3}; modeChanger changer(funcArr); changer.op(0); // 输出f1 changer.op(1); // 输出f2 return 0; }
方案2:typedef单个函数指针类型(推荐)
把typedef改为单个函数指针类型,后续的数组和指针操作会清晰很多,从根源上避免混淆:
#include <iostream> void f1 (void) { std::cout << "f1" << "\n"; } void f2 (void) { std::cout << "f2" << "\n"; } void f3 (void) { std::cout << "f3" << "\n"; } // 先typedef单个函数指针类型,可读性更强 typedef void (*FuncPtr)(void); class modeChanger { public: // 构造函数接收函数指针数组(退化为FuncPtr*) modeChanger(FuncPtr funcArray[]) : _funcArray(funcArray) {} void op(int index) { // 直接访问指针指向的数组元素即可 if (index >=0 && index <3) { _funcArray[index](); } } private: FuncPtr* _funcArray; // 指向函数指针数组的指针 }; int main() { FuncPtr funcArr[] = {f1, f2, f3}; modeChanger changer(funcArr); changer.op(0); // 输出f1 changer.op(2); // 输出f3 return 0; }
额外建议
- 永远加上索引边界检查,避免因非法索引导致的越界访问错误。
- 在C++11及以后,推荐使用
std::array或者std::vector来管理函数指针集合,比原生数组更安全、更易维护。
内容的提问来源于stack exchange,提问作者AlexKite
相关产品推荐
相关产品推荐

