Ваш подход не так хорош, так как он предполагает копирование структуры во временный примитивный массив.
Очень хорошее решение вашего вопроса - это так называемый гибкий массив.Google это для получения дополнительной информации.По сути это выглядит следующим образом.
struct my_fam_array_t {
int arr_size;
int arr[];
};
Чтобы использовать его, вы всегда объявляете его как указатель следующим образом
struct my_fam_array_t *arr5;
И затем инициализируете его следующим образом:
arr5 = malloc(sizeof(struct my_fam_array_t) + fam_size));
Где fam_size должен быть размером, который вам требуется для массива.
Еще две вещи, не забудьте установить размер массива в структуре, а также проверить состояние выделения памяти и обработать любые ошибки.
Не забудьте освободить его после использования.
Теперь вы можете обычно использовать массив, например
arr5->arr[3] = some_value;
Теперь вы можете создать функциюизменить размер массива.Я не собираюсь писать это, но то, что нужно сделать, это:
malloc новая структура с новым размером
Скопировать старый массив в новую структуру
Донне забудьте освободить старый массив
Это может быть новым для вас, учитывая, что вы новичок, однако гибкий массив - это инструмент, который вам нужен.
Кстати, вы можете использовать reallocКроме того, прочитайте об этом, это может быть полезно, однако будьте очень осторожны, чтобы правильно обработать сбой нехватки памяти.Google о realloc и SEI CERT C Стандарты
Редактировать:
Убедитесь, что вы используете C99 или выше.Наоборот, вам придется использовать структуру с размером массива 1 и вычесть 1 из размера malloc.Вы можете использовать массив с размером 0, если ваш компилятор поддерживает это расширение.