的 TL; DR: 强>
更换
Sequence s1 = {&ic_1tc_1};
同
const uint8_t *s1[] = {ic_1tc_1};
的 说明: 强>
让我们从简单的事情开始吧。
省略定义中的数组大小时,会推导出大小:
int x[] = {1,2,3};
在这里,类型 x 是 int[3] 。
x
int[3]
请注意,类型不是 int[] 。表示未知边界数组的类型是 不完整的类型 ,并且不能创建这种类型的对象。
int[]
以上工作甚至与 typedef S:
typedef
typedef int array[]; array x = {1,2,3};
注意类型 x 不是 array ,既然如此 int[3] 而不是 int[] 。
array
即使无法创建不完整类型的对象,也可以创建 指针 这种类型。
例如:
int (*ptr)[];
该声明具有与以下相同的效果:
typedef int array[]; array *ptr;
这个指针唯一指向的是 int[] ,但由于无法创建此类型的对象,因此不常使用指向未知边界数组的指针。
(虽然我可以想象一些特殊的用例。你可以 宣布 一个数组,有一个未知的边界,并在其他地方定义它时指定一个大小。然后,您可以使用声明形成指向数组的指针,并且此类指针的类型将是 T(*)[] 。)
T(*)[]
您无法指定地址 int[N] 这样的指针,正式 int[] 和 int[N] 是不同的类型。
int[N]
typedef int array[]; array x = {1,2,3}; array *ptr = &x; // Error, can't convert `int(*)[3]` to `int(*)[]`.
这正是您在代码中尝试做的事情。
一种可能的解决方案是为指针使用正确的类型:
typedef int array[]; array x = {1,2,3}; int (*ptr)[3] = &x;
但是既然你说你需要有一个指向各种大小数组的指针数组,那就不是一个选择了。
另一个可能的解决方案是转换指针,但这看起来并不方便(我不是100%肯定使用生成的指针是明确定义的)。
您可能应该只存储指向数组的第一个元素的指针:
typedef int array[]; array x = {1,2,3}; int *ptr = x;
在你的代码中它看起来像这样:
const Testcase ic_1tc_1 = {0x00, 0x10, 0x01, 0x61, 0x00, 0x30, 0x07}; const uint8_t *s1[] = {ic_1tc_1};