我强烈建议您不要使用 flex 数组,因为它们不过是杂物。您应该将其声明为 struct Field *、malloc 并将其用作任何其他动态数组的大小。
也就是说,malloc 的数组大小为 n_elem:
struct Register register = malloc(sizeof(*register) + n_elem * sizeof(*register->FieldArray));
访问元素:
char high = register->FieldArray[0].High;
对于初始化:in gcc, at least, 您可以像任何其他静态数组一样静态初始化数组部分。我不确定其他编译器如何处理它。
为什么不鼓励使用 flex 数组:
我会链接this post,但我不认为答案是完整的(大部分气馁是因为它只是 c-99),所以我会添加我的想法。
他们是个例外。本质上,您声明数组的大小为零,并且每次都超出范围访问它,只是在您分配的范围内。您不能像任何其他结构一样使用具有灵活数组的结构,例如您不能使用灵活数组 sizeof。如果声明一个静态成员或它们的数组,则不能使用该数组成员,因为没有为它分配空间。
在数组中使用它们的示例:
#include <stdio.h>
struct test {
int val;
int arr[];
};
int main() {
struct test tarr[2];
printf("%p\n%p\n", &tarr[0].arr[0], &tarr[1].val);
}
输出:
0x7fff59b67164
0x7fff59b67164
他们在同一个地址。如果您尝试写入数组成员,则会覆盖下一个对象。如果您尝试从中读取数据,则会从下一个对象中读取数据。根据填充,这甚至可能是填充中的无意义值。
它们就像goto 语句,两者都可能有用,但更多时候是个坏主意。如果您不知道它们为何危险,则不应使用它们(在实际代码中;在测试程序中使用它们以了解如何正确使用它们以及如何引入它们并不是一个坏主意问题)。