C 结构中的初始化数组

C 结构中的初始化数组,c,struct,C,Struct,我不明白为什么我在尝试以这种方式初始化结构时出错 typedef struct _floor { int room; int height; int room_dim[room][2]; }Floor; 为什么不能使用room来初始化room\u dim数组?Astruct必须具有编译时已知的大小room是一个结构变量,可以有任何值;因此,它不是编译时常量,不能用于调整struct成员的大小 相反,您可以使最后一个元素成为灵活的数组成员,并在运行时分配它: struct fl

我不明白为什么我在尝试以这种方式初始化结构时出错

typedef struct _floor
{
   int room;
   int height;
   int room_dim[room][2];
}Floor;

为什么不能使用room来初始化room\u dim数组?

A
struct
必须具有编译时已知的大小
room
是一个结构变量,可以有任何值;因此,它不是编译时常量,不能用于调整
struct
成员的大小

相反,您可以使最后一个元素成为灵活的数组成员,并在运行时分配它:

struct floor {
    int rooms;
    int height;
    int room_dim[][2];
};

struct floor *make_empty_floor(int rooms) {
    struct floor *ret = malloc(sizeof(struct floor) + sizeof(ret->room_dim)*rooms);
    ret->rooms = rooms;
    return ret;
}

现在您可以像往常一样使用
ret->room\u dim
,额外的
malloc
'd空间将用于
room\u dim

A
struct
必须具有编译时已知的大小
room
是一个结构变量,可以有任何值;因此,它不是编译时常量,不能用于调整
struct
成员的大小

相反,您可以使最后一个元素成为灵活的数组成员,并在运行时分配它:

struct floor {
    int rooms;
    int height;
    int room_dim[][2];
};

struct floor *make_empty_floor(int rooms) {
    struct floor *ret = malloc(sizeof(struct floor) + sizeof(ret->room_dim)*rooms);
    ret->rooms = rooms;
    return ret;
}

现在您可以像往常一样使用
ret->room\u dim
,额外的
malloc
'd空间将用于
room\u dim

您正在尝试动态初始化数组。这意味着您在运行时只知道房间的大小

[评论后编辑]

简单地说,如果不使用
struct
,即使在C99以下也无法编译,但是在structs中仍然不允许这样做

int n;  
int size[n];

您正在尝试动态初始化数组。这意味着您在运行时只知道房间的大小

[评论后编辑]

简单地说,如果不使用
struct
,即使在C99以下也无法编译,但是在structs中仍然不允许这样做

int n;  
int size[n];

您可以使用malloc来获取动态内存,而不是使用room_dim[room][2] .因为上述不是c编译器中允许的标准

比如说

typedef struct floor
{
   int *room_dim[];
   int height;
   int room;
}floor;
scanf("%d",&room);
floor.room_dim=(floor *) malloc(sizeof(floor)*room);

您可以使用malloc来获取动态内存,而不是使用room_dim[room][2] .因为上述不是c编译器中允许的标准

比如说

typedef struct floor
{
   int *room_dim[];
   int height;
   int room;
}floor;
scanf("%d",&room);
floor.room_dim=(floor *) malloc(sizeof(floor)*room);

实际上,在C99中,VLA是合法的。因此,在C99中,您的代码片段将被编译。在structs.user26XXX中仍然禁止VLA。请看一看,实际上,在C99中,VLA是合法的。因此,在C99中,您的代码片段将被编译。VLA在structs.user26XXX中仍然是禁止的。请看一看数组不能有零长度。这是一个非标准的GCC扩展。哎呀,我的意思是使用一个灵活的数组成员,而不是零长度的数组成员。不,不是。灵活的数组成员首先存在于GCC的C99之前版本中,如果最后一个结构成员被声明为长度为零的数组,则GCC允许确定性行为。然后在C99中,灵活数组成员被添加到标准中,但它们应该像您编辑的示例中那样编写,使用[]而不是[0]。[0]始终是非标准的GCC扩展@伦丁:谢谢。我知道正确的语法,但我的手指决定键入错误的东西(因为我以前为GCC编程的频率比C99高)。数组的长度不能为零。这是一个非标准的GCC扩展。哎呀,我的意思是使用一个灵活的数组成员,而不是零长度的数组成员。不,不是。灵活的数组成员首先存在于GCC的C99之前版本中,如果最后一个结构成员被声明为长度为零的数组,则GCC允许确定性行为。然后在C99中,灵活数组成员被添加到标准中,但它们应该像您编辑的示例中那样编写,使用[]而不是[0]。[0]始终是非标准的GCC扩展@伦丁:谢谢。我知道正确的语法,但我的手指还是决定键入错误的东西(因为我以前为GCC编程比为C99编程更频繁)。