请考虑以下两种结构:
typedef struct {
int num_data;
char * name_data;
int data[];
} part_t;
typedef struct {
int num_parts;
char * name_parts;
part_t parts[];
} container_t;
理想情况下,我可以初始化一个像这样的容器:
const container_t container = {
2,
"Name of first container",
{
{ 4, "Name of first part", { 1, 2, 3, 4 } },
{ 5, "Name of first part", { 1, 2, 3, 4, 5 } }
}
};
我的编译器说:“错误:初始化程序太多”
答案 0 :(得分:3)
ISO / IEC 9899:2011§6.7.2.1结构和联合说明符
3结构或联合不得包含不完整或功能类型的成员(因此, 结构不应包含自身的实例,但可以包含指向实例的指针 它本身),除了具有多个命名成员的结构的最后一个成员 可能有不完整的数组类型;这样的结构(和任何包含的结合,可能 递归地,这种结构的成员不应该是结构的成员或者 数组的元素。
18作为一种特殊情况,具有多个命名成员的结构的最后一个元素可以 有一个不完整的数组类型;这被称为灵活的阵列成员。在大多数情况下, 灵活的数组成员被忽略。特别是,结构的大小就像是 省略了灵活的数组成员,除了它可能有更多的尾随填充 遗漏意味着。但是,当一个。 (或 - >)运算符具有左操作数 (指向)具有灵活数组成员和右操作数名称的结构 成员,它的行为好像该成员被替换为最长的数组(具有相同的 元素类型)不会使结构大于被访问的对象;该 数组的偏移量应保持灵活阵列成员的偏移量,即使这会有所不同 从替换阵列的。如果此数组没有元素,则表现得好像 它有一个元素,但如果有任何尝试访问它,行为是未定义的 元素或生成一个经过它的指针。
问题在于,您无法将具有灵活数组成员的结构嵌入到聚合(数组,或其他结构或联合)中。您可以指向此类结构,但不能指向此类结构的实例。