1

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

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

为什么我不能使用 room 来初始化 room_dim 数组?

4

3 回答 3

5

Astruct必须具有在编译时已知的大小。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.

于 2013-08-06T11:25:01.893 回答
2

您可以改为使用 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);
于 2013-08-06T13:12:40.480 回答
1

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

[评论后编辑]

为了简单地理解它,不使用struct,即使这样也不会在 C99 以下编译,但是在结构中仍然不允许这样做

int n;  
int size[n];
于 2013-08-06T11:28:15.770 回答