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

How can I declare an array of pointers with blocks of NULL elems

提问人:mescande 提问时间:11/8/2023 更新时间:11/8/2023 访问量:104

问:

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

我不想在开头写十个 NULL elems,有没有可能以某种方式这样声明:

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

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

c 函数指针 stack-memory

评论

1赞 Brian61354270 11/8/2023
您是在寻找严格标准的 C 语言还是扩展可以吗?
0赞 ChrisBD 11/8/2023
您好,欢迎来到论坛。就我个人而言,我更喜欢定义一个具有函数指针和事件 Id 元素的结构类型,然后定义一个结构类型的数组。所有元素最初都将为 null。然后,您可以在数组中搜索事件 ID。通常的权衡,速度与内存。
0赞 user3386109 11/8/2023
速度与内存的更好权衡是使用条件语句将 ID 映射到0x00范围0x25。然后,数组中只需要 3 个 NULL 条目,而不是 221 个,并且不需要指定的初始值设定项。在具有条件移动指令的处理器上,代码将是无分支的,因此几乎没有时间被浪费。代码示例: .array_index = (id < 0x20) ? (id - 0x10) : (id - 0x80)

答:

2赞 Brian61354270 11/8/2023 #1

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

int (*tab[256])(uint8_t *data, int *datalen) = {
   [0 ... 9] = NULL, /* optional, requires GNU extension */
   [0x10] = fun1,
   [0x11] = fun2,    /* additional designators are optional after the first in sequence */
   /* ... */         /* only the first designator '[0x10] =' is required. */
   [0x1C] = funN,    
                     
   [0x90] = funa,
   /* ... */
   [0xA5] = funz,   /* again, '[0xA5] =' is optional when listing values in sequence. */
};

没有初始值设定项的条目将隐式初始化为 。0

评论

0赞 tstanisl 11/8/2023
[0 ... 9] = NULL,部分是冗余的
0赞 Brian61354270 11/8/2023
@tstanisl正确,它在答案中是这样注释的,并在最后一句话中提到。
5赞 dbush 11/8/2023 #2

您可以在标准 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,
   ...
};

语法将数组的第 n 个元素设置为给定值。我们用它来设置组中的第一个非 NULL 元素。然后,后续初始值设定项将按给定对象之后的顺序进行设置,因此无需为每个初始值设定项显式指定索引。我们还可以利用未显式初始化的数组元素设置为 .[n] = xNULL

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

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

评论

0赞 mescande 11/8/2023
谢谢,正如我所想知道的,所有未指定的元素都初始化为 0,如文档中所述