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

如何声明含批量NULL元素块的函数指针数组以对应事件ID?

解决函数指针数组与非连续事件ID对应问题

你的写法NULL[10]是错误的——NULL是空指针,对它做下标访问属于未定义行为,编译或运行时都会出问题。针对你的需求,有两种靠谱的解决方案:

方案一:C99指定初始化器(推荐)

这是最简洁的方式,直接给对应事件ID的数组索引赋值,未指定的元素会自动初始化为NULL,完全不用手动填充前面的空元素:

#include <stdint.h>

// 先定义函数指针类型,让代码更清晰
typedef int (*EventHandler)(uint8_t *data, int *datalen);

EventHandler event_handlers[256] = {
    // 对应0x10到0x1C的事件ID
    [0x10] = handle_event_10,
    [0x11] = handle_event_11,
    // ... 依次填到[0x1C] = handle_event_1C,
    // 对应0x90到0xA5的事件ID
    [0x90] = handle_event_90,
    [0x91] = handle_event_91,
    // ... 依次填到[0xA5] = handle_event_A5
};

使用时直接通过事件ID作为索引访问数组即可:

uint8_t event_id = 0x10;
if (event_handlers[event_id] != NULL) {
    event_handlers[event_id](data, &datalen);
}

方案二:老编译器兼容方案(宏填充NULL)

如果你的编译器不支持C99,只能用宏来批量填充NULL,但这种方法比较繁琐,仅作备选:

// 定义宏批量生成NULL,这里以填充10个为例
#define FILL_10_NULLS NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
#define FILL_116_NULLS NULL,NULL,NULL,... /* 手动或用嵌套宏生成116个NULL */

int (*tab[256])(uint8_t *data, int *datalen) = {
    FILL_10_NULLS,
    fun1, fun2, ..., funx, // 对应0x10到0x1C的13个函数(0x1C-0x10+1=13)
    FILL_116_NULLS,
    fun90, fun91, ..., funA5 // 对应0x90到0xA5的22个函数(0xA5-0x90+1=22)
};

显然这种方法远不如指定初始化器方便,所以优先推荐方案一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:52:53