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 dimAstruct
必须具有编译时已知的大小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编程更频繁)。