【问题标题】:Initialization array in a struct结构中的初始化数组
【发布时间】:2013-08-07 09:08:53
【问题描述】:

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

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

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

【问题讨论】:

    标签: c struct


    【解决方案1】:

    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。

    【讨论】:

    • 数组长度不能为零。这是一个非标准的 GCC 扩展。
    • 哎呀,我的意思是使用灵活的数组成员,而不是零长度的数组成员。
    • 不,不是。 See this.
    • 灵活数组成员首先存在于 GCC 的 C99 之前的版本中,如果最后一个结构成员被声明为长度为零的数组,则 GCC 允许确定性行为。然后在 C99 中,灵活的数组成员被添加到标准中,但它们应该像您编辑的示例中那样编写,使用 [] 而不是 [0]。 [0] 始终是非标准的 GCC 扩展。 More info here.
    • @Lundin:谢谢。我知道正确的语法,但我的手指还是决定输入错误的东西(因为我以前为 GCC 编程比 C99 更频繁)。
    【解决方案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);
    

    【讨论】:

      【解决方案3】:

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

      [在cmets之后编辑]

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

      int n;  
      int size[n];
      

      【讨论】:

      • 嗯,实际上,在 C99 中,VLA 是合法的。因此,在 C99 中,您的代码 sn-p 将编译。结构中仍然禁止使用 VLA。
      • user26XXX 请看here
      猜你喜欢
      • 1970-01-01
      • 2012-05-02
      • 2015-07-29
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      相关资源
      最近更新 更多