具有灵活阵列成员的恒定结构

时间:2012-12-04 23:24:36

标签: c struct const variable-length-array

请考虑以下两种结构:

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 } } 
    } 
};

我的编译器说:“错误:初始化程序太多”

1 个答案:

答案 0 :(得分:3)

ISO / IEC 9899:2011§6.7.2.1结构和联合说明符

  

3结构或联合不得包含不完整或功能类型的成员(因此,   结构不应包含自身的实例,但可以包含指向实例的指针   它本身),除了具有多个命名成员的结构的最后一个成员   可能有不完整的数组类型;这样的结构(和任何包含的结合,可能   递归地,这种结构的成员不应该是结构的成员或者   数组的元素。

     

18作为一种特殊情况,具有多个命名成员的结构的最后一个元素可以   有一个不完整的数组类型;这被称为灵活的阵列成员。在大多数情况下,   灵活的数组成员被忽略。特别是,结构的大小就像是   省略了灵活的数组成员,除了它可能有更多的尾随填充   遗漏意味着。但是,当一个。 (或 - >)运算符具有左操作数   (指向)具有灵活数组成员和右操作数名称的结构   成员,它的行为好像该成员被替换为最长的数组(具有相同的   元素类型)不会使结构大于被访问的对象;该   数组的偏移量应保持灵活阵列成员的偏移量,即使这会有所不同   从替换阵列的。如果此数组没有元素,则表现得好像   它有一个元素,但如果有任何尝试访问它,行为是未定义的   元素或生成一个经过它的指针。

问题在于,您无法将具有灵活数组成员的结构嵌入到聚合(数组,或其他结构或联合)中。您可以指向此类结构,但不能指向此类结构的实例。