如何声明带有 NULL 元素块的指针数组

mes*_*nde 3 c function-pointers stack-memory

我正在使用函数指针数组,并且我想直接将其与其关联的事件 ID 一起使用。问题是,事件 ID 从 0x10 开始到 0x1C,从 0x90 到 0xA5。

我不想在开始时写十个 NULL 元素,是否可以以某种方式声明如下:

int (*tab[256])(uint8_t *data, int *datalen) = {
   NULL[10],
   fun1,
   [...],
   funx,
   NULL[116],
...
};
Run Code Online (Sandbox Code Playgroud)

目前,我没有看到令人满意的解决方案,这就是我问的原因

dbu*_*ush 5

您可以使用指定的初始值设定项在标准 C 中执行此操作:

int (*tab[256])(uint8_t *data, int *datalen) = {
   [0x10] = fun_a_1,
   fun_a_2,
   fun_a_3,
   ...
   fun_a_n,
   [0x90] = fun_b_1,
   fun_b_2,
   fun_b_3,
   ...
};
Run Code Online (Sandbox Code Playgroud)

该语法[n] = x将数组的第 n 个元素设置为给定值。我们用它来设置组中的第一个非 NULL 元素。随后的初始值设定项会在给定对象之后按顺序设置,因此您无需显式指定每个初始值设定项的索引。我们还可以利用未显式初始化的数组元素被设置为 的事实NULL

因此,在上面的示例中,元素 0x10 被显式设置为第一个函数指针。然后,初始化器列表中的下一个对象应用于元素 0x11,下一个对象应用于 0x12,依此类推。

虽然某些编译器可能支持一系列初始值设定项作为扩展,即[ 0 ... 9 ],上述内容不依赖于此类扩展并且符合 C 标准。