【发布时间】:2013-08-07 09:08:53
【问题描述】:
我不明白为什么当我尝试以这种方式初始化结构时出现错误
typedef struct _floor
{
int room;
int height;
int room_dim[room][2];
}Floor;
为什么我不能使用 room 来初始化 room_dim 数组?
【问题讨论】:
我不明白为什么当我尝试以这种方式初始化结构时出现错误
typedef struct _floor
{
int room;
int height;
int room_dim[room][2];
}Floor;
为什么我不能使用 room 来初始化 room_dim 数组?
【问题讨论】:
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_dim,额外的malloc'd 空间将用于room_dim。
【讨论】:
您可以改为使用 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);
【讨论】:
您正在尝试动态初始化一个数组。这意味着您只会在运行时知道房间的大小。
[在cmets之后编辑]
为了简单理解,不使用struct,即使在C99以下也无法编译,但是在结构中仍然不允许这样做
int n;
int size[n];
【讨论】: