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

问题描述 投票:0回答:2

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

我不想在开头写十个NULL元素,是否可以以某种方式这样声明:

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

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

c function-pointers stack-memory
2个回答
2
投票

如果您使用 C99 或更高版本(或者使用 GCC 作为编译器并在启用 GNU 扩展的情况下进行编译),您可以使用 指定初始化器来表达这一点。例如:

int (*tab[256])(uint8_t *data, int *datalen) = {
   [0 ... 9] = NULL, /* optional */
   [0x10] = fun1,
   /* ... */
   [0x1C] = funx,
   [0x90] = funa,
   /* ... */
   [0xA5] = funy,
};

没有初始化器的条目将隐式初始化为

0


0
投票

您可以在标准 C 中使用指定的初始化器来完成此操作:

int (*tab[256])(uint8_t *data, int *datalen) = {
   [0xf] = NULL,
   fun_a_1,
   ...
   fun_a_n,
   [0x8f] = NULL,
   fun_b_1,
   ...
};

语法

[n] = x
将数组的第 n 个元素设置为给定值。我们用它来设置最后一个 NULL 元素来设置初始化列表的“当前对象”。然后在给定对象之后按顺序设置后续的初始化程序。我们还可以利用未显式初始化的数组元素被设置为 NULL这一事实。
因此在上面的示例中,元素 0xf 被显式设置为 

NULL

。然后,初始化器列表中的下一个对象应用于元素 0x10,下一个对象应用于 0x11,依此类推。

    

© www.soinside.com 2019 - 2024. All rights reserved.