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

如何正确声明可传入get_operations的函数指针数组以调用指定函数?

解决函数指针数组声明与使用问题

首先明确:C标准中函数指针和对象指针(如void*)属于不同类型,不能直接互相转换,原代码用void**存储函数指针的做法不符合标准,存在未定义行为,这是你声明数组时出错的核心原因。

步骤1:统一函数指针类型(推荐方案)

假设你的8个函数签名一致(比如都是无参数、返回void),先定义函数指针类型(根据实际函数签名调整参数和返回值):

typedef void (*TirePMUOperation)(void);

步骤2:修改get_operations函数

将参数类型从void**改为定义好的函数指针数组类型:

void get_operations(TirePMUOperation operations[]) {
    operations[0] = tire_pressure_status;
    operations[1] = tire_temperature_status;
    operations[2] = tire_wear_level_status;
    operations[3] = tire_performance_score;
    operations[4] = pmu_compute_power;
    operations[5] = pmu_regenerate_energy;
    operations[6] = pmu_get_energy_usage;
    operations[7] = pmu_is_battery_healthy;
}

步骤3:声明并使用函数指针数组

int main() {
    // 声明可容纳8个函数指针的数组
    TirePMUOperation operations[8];
    
    // 填充数组
    get_operations(operations);
    
    // 调用数组中的函数
    operations[0](); // 调用tire_pressure_status
    operations[1](); // 调用tire_temperature_status
    // ... 依次调用剩余函数
    return 0;
}

特殊情况:函数签名不一致

如果8个函数的参数或返回值不同,可通过结构体封装不同类型的函数指针:

// 定义结构体存储不同类型的函数指针
typedef struct {
    void (*tire_status_func)(void);
    int (*pmu_calc_func)(int);
    // 根据实际函数类型添加对应字段
} OperationSet;

// 调整get_operations函数
void get_operations(OperationSet* ops) {
    ops->tire_status_func = tire_pressure_status;
    // ... 完成其他字段赋值
}

内容的提问来源于stack exchange,提问作者vasile ion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:18:15