在另一个结构内创建结构数组

时间:2019-03-23 16:22:34

标签: c arrays struct

我在代码方面遇到麻烦

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

typedef struct{
int ammount;
Passanger bus_array[ammount];
} Bus;
  

此处未申报的金额。

3 个答案:

答案 0 :(得分:1)

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


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

typedef struct{
    int ammount;
    Passanger *bus_array;
} Bus;

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

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

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

typedef struct{
    int ammount;
    Passanger bus_array[];
} Bus;

然后,您需要动态分配Bus结构:

int amount = get_passenger_amount();

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

两种方法之间可能有一些差异值得一提。最重要的是,第一种方法进行两个单独且不同的分配:一个分配给Bus结构,另一个分配给bus_array。第二种方法是对所有Bus结构和bus_array都只有一个组合分配。

答案 1 :(得分:0)

这里

typedef struct{
  int ammount;
  Passanger bus_array[ammount];
} Bus;

当编译器看到以下情况

Passanger bus_array[ammount];

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

代替

Passanger bus_array[ammount];

您可以

Passanger *bus_array;

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

答案 2 :(得分:0)

添加到@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);
}