我在代码方面遇到麻烦
typedef struct{
int a;
int b;
} Passanger;
typedef struct{
int ammount;
Passanger bus_array[ammount];
} Bus;
此处未申报的金额。
答案 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);
}