You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:25:27