初始化结构数组时出错

时间:2019-03-03 18:56:57

标签: c arrays struct preprocessor

我的结构如下所示,可以有n个vendor,其中可以包含n个test结构。 我正在尝试初始化此结构。这是我正在尝试的示例代码,稍后我想使用宏进行设置并加载X-macros之类的结构。

我还使用了灵活的结构概念,因为我不知道供应商将要使用多少测试结构。数据将在一个文件中,该结构需要加载其中的所有内容。我为SO创建了一个最小的示例代码。 下面是我的代码。

#include <stdio.h>

typedef struct test{
int a;
int b;
int c;
}test;

typedef struct vendor{
int size;
test t[0];
}vendor;

vendor v[]={

{.size = 1, .t[] = {{1,2,3},}}
};

int main()
{
return 0;
}

我收到此错误-

a.c:16: error: expected expression before ‘]’ token
a.c:16: error: array index in initializer not of integer type
a.c:16: error: (near initialization for ‘v[0].t’)
a.c:16: error: extra brace group at end of initializer
a.c:16: error: (near initialization for ‘v[0]’)
a.c:16: error: extra brace group at end of initializer
a.c:16: error: (near initialization for ‘v[0]’)
a.c:16: warning: excess elements in struct initializer
a.c:16: warning: (near initialization for ‘v[0]’)

我尝试了没有灵活的结构,到目前为止没有运气。 关于如何初始化此结构的任何建议?

1 个答案:

答案 0 :(得分:3)

初始化器中的.t[]=语法无效。使用指定的初始值设定项时,只需指定成员的名称:

.t={1, 2, 3}

但是,这仍然不适用于灵活的数组成员。

具有灵活数组成员的结构的大小不包括该灵活数组成员的空间,因此您不能为其创建静态或自动实例。您需要为该结构动态分配内存:

vendor *v;

void init()
{
    v = malloc(sizeof(vendor) + 1 * sizeof(test));
    v.size = 1;
    v.t = (test){1, 2, 3};
}

int main()
{
    init();
    return 0;
}

此外,由于大小可变,具有灵活的数组成员cannon的结构也将成为数组的成员。