Создание массива структуры внутри другой структуры - PullRequest
1 голос
/ 23 марта 2019

У меня проблемы с кодом:

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

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

Сумма, не указанная здесь.

Ответы [ 3 ]

1 голос
/ 23 марта 2019

У вас есть две альтернативы, каждая из которых включает динамическое распределение памяти. Большая разница в структуре , которую вы выделяете динамически.


Первая альтернатива использует указатель вместо массива:

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));

Второй вариант - использование гибкого элемента массива (как я уже упоминал в комментарии):

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.

0 голосов
/ 23 марта 2019

Добавьте к правильному ответу @ 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);
}
0 голосов
/ 23 марта 2019

Здесь

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...