初始化结构数组内的结构数组

时间:2012-03-23 06:14:53

标签: c arrays structure

我在结构数组中初始化结构数组时遇到了一个问题。例如,如果我有如下代码:

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

请帮忙。

4 个答案:

答案 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的编译器。