C语言定义函数指针后调用出现编译错误,请问错误原因是什么?
函数指针调用错误原因及修正方案
错误原因
你定义的myfunc是函数指针类型(通过typedef创建的类型别名),而非实际的函数指针变量。C语言中只有变量(或合法表达式)才能用来调用函数,直接使用类型名执行函数调用操作是非法的,这就是编译器报错的核心:
- 第一处错误:
(*myfunc)(0, 0, 0, 0)中,myfunc是类型标识,不是可解引用的表达式,编译器无法识别该操作。 - 第二处错误:
myfunc(0, 0, 0, 0)中,编译器试图将myfunc当作函数名,但它本质是类型名,无法直接跟随参数列表完成调用。
修正方案
要正确使用函数指针,需先定义对应类型的变量,并让它指向一个符合签名的函数,再通过变量完成调用。
完整示例代码
#include <stdio.h> // 定义函数指针类型:指向接受4个long参数、返回long的函数 typedef long (*myfunc)(long, long, long, long); // 实现一个符合该签名的示例函数 long demo_func(long a, long b, long c, long d) { return a + b + c + d; } void mytest() { // 1. 定义myfunc类型的函数指针变量,指向demo_func myfunc func_ptr = demo_func; // 2. 两种合法调用方式(效果完全等价) // 方式1:直接用函数指针变量调用 long result1 = func_ptr(1, 2, 3, 4); // 方式2:解引用后调用(C语言允许省略解引用操作) long result2 = (*func_ptr)(1, 2, 3, 4); printf("Result1: %ld\nResult2: %ld\n", result1, result2); } int main() { mytest(); return 0; }
编译运行验证
使用gcc编译运行:
gcc test.c -o test ./test
输出结果:
Result1: 10 Result2: 10
内容的提问来源于stack exchange,提问作者weima
相关产品推荐
相关产品推荐

