今天在优化代码时遇到一个问题,就是我定义一个结构体,这个结构体的成员是另一个结构体数组,简化版如下:
typedef struct
{
int a;
int b;
}base;
typedef struct
{
base data[2];
}goal;
我一直按以前理解的方式对这个结构体进行初始化,会一直报错,error: extra brace group at end of initializer/warning: excess elements in struct initializer。
int main()
{
goal mygoal[2]=
{
{{10, 20}, {30, 40}},
{{50, 60}, {70, 80}},
};
printf("%d\n", mygoal[0].data[0].b);
return 0;
}
查阅资料,应该是结构体成员地址分配问题,不过没有理解,反正问题是解决了,如果有读者清楚,可以评论区留言。
#include<stdio.h>
typedef struct
{
int a;
int b;
}base;
typedef struct
{
base data[2];
}goal;
int main()
{
goal mygoal[2]=
{
{.data[0]={10, 20}, .data[1]={30, 40}},
{.data[0]={50, 60}, .data[1]={70, 80}},
};
printf("%d\n", mygoal[0].data[0].b);
return 0;
}
今天又试了一下,发现知道之前为什么错了,平常我们初始化数组时,要这样写int a[2] = { 10, 20 }
,10表示第一个元素,但我的元素是一个结构体,所以要加一个大括号,即int a[2] = { {} , {} }
,且结构体里面的元素又是一个结构体数组,int a[2] = { { {} }, { { } } }
,最里面才是底层的数据,即
int a[2] = { { { {}, {} } }, { { {}, {} } } }
int a[2]=
{
{{{}, {}}},
{{{}, {}}}.
};
所以之前会报类似于大括号不匹配的错误,完整代码如下
#include<stdio.h>
typedef struct
{
int a;
int b;
}base;
typedef struct
{
base data[2];
}goal;
int main()
{
goal mygoal[2]=
{
{ { {10, 20}, {30, 40} } },
{ { {50, 60}, {70, 80} } },
};
printf("%d\n", mygoal[0].data[0].b);
return 0;
}