编程系统程序员

揭示C语言中函数指针的声明和使用特点。如何正确存储指向不同函数的指针数组并动态调用它们?

用 Hintsage AI 助手通过面试

答案

C语言中的函数指针是一个变量,它存储函数的地址,从而允许动态选择要调用的函数。函数指针的常规声明:

// 接受int并返回int的函数指针 int (*f_ptr)(int);

对于指针数组:

int func1(int x) { return x + 1; } int func2(int x) { return x * 2; } int (*f_arr[2])(int) = { func1, func2 }; int result = f_arr[1](10); // 返回20
  • 这种方法允许创建命令表、处理程序或自动将操作与操作编号关联。
  • 所有函数必须具有相同的签名。
  • 在处理函数指针时,类型必须完全匹配。

陷阱问题

是否可以通过函数指针调用具有不同签名的函数?

常见错误答案: “是的,如果使用类型转换”。

正确答案: 从技术上讲,由于指针的动态特性,这是可能的,但此操作会导致运行时错误和不可预测的行为,因为调用的函数具有不同的调用约定和参数组合。

示例:

void funcA(int x) { printf("A: %d ", x); } void funcB(float y) { printf("B: %f ", y); } void (*fptr)(int) = (void (*)(int)) funcB; fptr(5); // 错误:将传递错误的数据

因不知道主题细节而造成的实际错误示例


故事

在插件系统项目中,将不同签名的函数加入指针表(一个返回int,另一个返回void)。在某些架构上运行时堆栈被破坏。

故事

在旧的命令管理系统中,使用函数指针数组。新手添加了一个带有额外参数的函数,导致在转到数组的新元素后发生不可预测的执行。

故事

在固件中未检查函数指针更改的结果。处理程序数组的初始化不足会导致调用空指针(NULL),设备随后无响应而不通知用户。