我在结构数组中初始化结构数组时遇到了一个问题。例如,如果我有如下代码:
#include <stdio.h>
int main() {
typedef struct {
int a;
int b;
int c;
} FIRST_T;
typedef struct {
int x;
int y;
int z;
FIRST_T *p;
} SECOND_T;
FIRST_T p1[]={{1,2,3},{3,4,5},{6,7,8}};
FIRST_T p2[]={{4,5,6},{7,8,9}};
SECOND_T my_second[]=
{
{1,2,3,p1},
{4,5,6,p2}
};
}
如果我必须在第二个数组初始化部分本身初始化我的第一个数组,那么我将如何编写我的typedef SECOND_T? 喜欢
SECOND_T my_second[]=
{
{1,2,3,{{1,2,3},{4,5,6},{7,8,9}}},
{4,5,6,{{1,1,1},{2,2,2}}}
};
那么我的SECOND_T怎么样呢?
我确信我无法将其定义为:
typedef struct {
int x;
int y;
int z;
FIRST_T p[]; //(I know its a blunder)
} SECOND_T;
请帮忙。
答案 0 :(得分:1)
我认为你不能这样做,即在FIRST_T
的初始化中初始化SECOND_T
,而不是你做的第一种方式。想一想,编译器如何告诉FIRST_T
中有多少SECOND_T
?这里的问题是,你可以静态地定义一个灵活大小的结构数组。
答案 1 :(得分:1)
您无法在C中定义具有无界数组的类型,您必须指定维度。所以你要么:
typedef strut {
int x;
int y;
int z;
FIRST_T f[SOME_VALUE];
} SECOND_T;
然后初始化SOME_VALUE
成员数始终,或者按照您的方式进行。
答案 2 :(得分:0)
你不能这样做:
SECOND_T my_second[]=
{
{1,2,3,{{1,2,3},{4,5,6},{7,8,9}}},
{4,5,6,{{1,1,1},{2,2,2}}}
};
与
typedef struct {
int x;
int y;
int z;
FIRST_T p[]; //(I know its a blunder)
} SECOND_T;
因为编译器不知道如何为此结构使用malloc内存。如果你必须这样做,你应该定义
typedef struct { int x,y,z; FIRST_T p[CONST_VALUE];}SECOND_T;
但我建议你使用你写的第一种风格。
答案 3 :(得分:0)
我不知道我是否完全抓住了你的问题。如果您要避免必须为结构中的指针声明辅助变量,则可以使用复合文字,如下所示:
SECOND_T my_second[] = {
{1,2,3, &(FIRST_T){{1,2,3},{3,4,5},{6,7,8}}},
{4,5,6, &(FIRST_T){{4,5,6},{7,8,9}}}
};
你有一个符合C99的编译器。