Существует несколько возможных решений, ни одно из которых не удовлетворяет всем вашим требованиям.
Вызов malloc
является очевидным решением; вот для чего это. Вы сказали, что не хотите использовать malloc
, но не объяснили почему.
C поддерживает массивы переменной длины - более или менее. VLA не существовали в C90, были введены в C99 и стали необязательными в C11. Поэтому, если вы хотите переносимый код, вы не можете предполагать, что он поддерживается. Если они есть, вы можете сделать что-то вроде этого:
int size;
// get value of size from input
int vla[size];
Есть некоторые ограничения. Если памяти недостаточно (размер стека может быть более строгим, чем размер кучи), поведение не определено. С другой стороны, то же самое верно для обычных массивов фиксированного размера, и VLA могут позволить вам выделять меньший объем памяти, чем предполагать фиксированную верхнюю границу. VLA существуют только в области видимости блока, поэтому объект перестает существовать, когда элемент управления покидает охватывающий блок (обычно, когда функция возвращается).
Вы можете определить массив (возможно, в области действия файла, вне определения любой функции), который, как вы знаете, достаточно велик для ваших данных. Вы должны будете указать некоторую верхнюю границу. Например, вы можете определить int arr[10000];
, а затем отклонить любой ввод больше 10000. Затем вы можете использовать начальное подмножество этого массива для ваших данных.
Вы говорите, что хотите создать «массив переменного размера», но «вы не хотите использовать malloc / другие методы динамического массива». Похоже, вы хотите создать динамический массив, но вы не хотите создавать динамический массив. Это все равно что сказать, что ты хочешь привинтить винт, но не хочешь использовать отвертку.