【问题标题】:Creating array of struct inside another struct在另一个结构中创建结构数组
【发布时间】:2019-03-23 16:22:34
【问题描述】:

我的代码有问题:

typedef struct{
    int a;
    int b;
} Passenger;

typedef struct{
    int amount;
    Passenger bus_array[amount];
} Bus;

此处未申报的金额。

【问题讨论】:

  • 不,不会。事实上,您不能声明这样的结构,因为当您创建它的实例时,编译器不知道要为它保留多少空间。您必须使用指针并动态分配数组。您很可能会在设置ammount[sic] 并取消分配旧内存然后分配新内存的函数中更改amount。这将朝着 C++ 的方向发展(类是对它们进行操作的数据结构)。
  • 也许您正在寻找的是flexible array member
  • 谢谢你,Peter,你能帮我分配内存吗?我知道如何将 malloc 用于 int 或 double 数据类型,但不知道用于 struct 数据类型:(
  • 当您使用mallocint 的数组分配内存时,您使用sizeof(int) 作为元素大小对吗?与结构完全相同,但类型是例如struct Passanger,表示你使用sizeof(struct Passanger)
  • @Someprogrammerdude 我不知道灵活的数组成员(只知道 C99 之前的 hack 与静默扩展端数组)。这样的结构总是需要动态分配它们的空间,这意味着它们不能在数组中,对,因为它们的sizeof() 是错误的(嘿,它是sizeoff()!)? (除了大小为零的数组。)

标签: c arrays struct


【解决方案1】:

您有两种选择,都涉及动态内存分配。最大的区别在于您动态分配的结构


第一种选择是使用指针而不是数组:

typedef struct{
    int amount;
    Passenger *bus_array;
} Bus;

一旦知道amount 的值,就可以为bus_array 分配内存:

Bus my_bus;
bus.amount = get_passenger_amount();
bus.bus_array = malloc(bus.amount * sizeof(Passenger));

第二种选择是使用flexible array member(正如我在评论中提到的):

typedef struct{
    int amount;
    Passenger bus_array[];
} Bus;

那么你需要动态分配Bus结构:

int amount = get_passenger_amount();

Bus *my_bus = malloc(sizeof(Bus) + amount * sizeof(Passenger));
my_bus->amount = amount;

这两种方法之间存在一些值得注意的差异。最重要的是,第一种方法进行了两个独立且不同的分配:一个用于Bus 结构,另一个用于bus_array。第二种方法只有一个组合分配所有Bus 结构以及bus_array

【讨论】:

  • 非常感谢! :)
  • 第一个变体中的结构'Bus'足够小,可以通过值作为参数/返回值传递。因此它通常也是一个分配
【解决方案2】:

添加到@Achai 的正确答案,因为你问,我会像这样为乘客分配内存:

typedef struct{
  int amount;
  Passenger *bus_array;
} Bus;

Bus emptyBus = { 0, NULL}; // use this to initialize new buses so that pointer and amount are zero.

void changeAmount(Bus *bus, int amount)
{
  bus->amount = amount;
  free(bus->bus_array); // freeing a null pointer is OK.
  bus->bus_array = malloc(sizeof(Passenger)*amount);
}

【讨论】:

    【解决方案3】:

    这里

    typedef struct{
      int amount;
      Passenger bus_array[amount];
    } Bus;
    

    当编译器看到下面的语句

    Passenger bus_array[amount];
    

    它不知道要为bus_array 分配多少内存,因为amount 在这个阶段对于编译器来说是未知。因此它会引发错误。

    而不是

    Passenger bus_array[amount];
    

    你可以使用

    Passenger *bus_array;
    

    当编译器知道amount 是什么时,您可以为bus_array 分配等于amount 字节的内存。

    【讨论】:

    • 谢谢!我将继续使用这种方法:)
    猜你喜欢
    • 1970-01-01
    • 2016-02-08
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多