Как определить размер массива на основе количества входов?

Насколько мне известно (я новичок в c), вы можете определить размер массива, если пользователь знает, сколько входных данных пользователь собирается предоставить. Но как я могу определить размер массива на основе количества входных данных?

Например, если мне нужно ввести 10 чисел, то как мне объявить массив таким образом, чтобы его размер был равен 10 на основе подсчета моего ввода? (не знаю, возможно ли это, но все же хочу узнать)


person overmass123    schedule 21.01.2016    source источник
comment
Это то, что называется выделением памяти, и это не уровень для начинающих. Если вам действительно интересно, поищите в Google malloc, calloc и realloc. Но если вы действительно новичок, просто продолжайте учиться, это придет позже.   -  person Aleksandar Makragić    schedule 21.01.2016


Ответы (3)


Начиная с C99 вы можете использовать массивы переменной длины. Вы можете объявлять их по ходу дела, используя переменную size_t для их размера.

size_t n;
printf("How many numbers would you like to enter?\n");
scanf("%zu", &n);
int array[n];
for (size_t i = 0 ; i != n ; i++) {
    printf("Enter number %zu: ", i+1);
    scanf("%d", &array[i]);
}
printf("You entered: ");
for (size_t i = 0 ; i != n ; i++) {
    printf("%d ", array[i]);
}
printf("\n");

Демо.

Примечание. Этот подход работает для относительно небольших массивов. Если вы предполагаете использовать массивы большего размера, не используйте этот подход, так как это может привести к неопределенному поведению (переполнение области автоматического хранения). Вместо этого используйте malloc и free.

person Sergey Kalinichenko    schedule 21.01.2016

Я думаю, вы должны рассмотреть концепцию указателей в C. вы можете просмотреть эти видео

При распределении памяти для 1d массивов динамические указатели очень удобны.

person Harkirat Saluja    schedule 21.01.2016
comment
это должен быть комментарий - person ForeverStudent; 21.01.2016
comment
@ForeverStudent: это возможный ответ на заданный вопрос, поскольку он новичок в C, поэтому, если я напишу код C, используя указатели для ответа на его запрос, ему будет трудно понять его за один раз. Я подумал, что будет лучше, если он узнает об указателях и поймет их таким образом :) . Пожалуйста, поправьте меня, я ошибаюсь - person Harkirat Saluja; 21.01.2016
comment
ссылка на внешний ресурс может быть полезной, но это не ответ - person ForeverStudent; 21.01.2016

Вы, безусловно, можете использовать массивы переменной длины (представленные в C99), но известно, что в последнем стандарте C11 эта функция стала необязательной. Последние версии компиляторов не обязаны поддерживать эту функцию в будущем. Если вам интересно, проверьте этот ответ.

Лучше всего использовать указатели и функции динамического выделения памяти, такие как malloc(). и семья.

Пример: (псевдокод)

int * p = NULL;
int input = -1;
scanf("%d", &input);
p = malloc(input * sizeof*p);
if (p) { .....

здесь вы можете контролировать размер выделения, используя значение переменной input.

P.S. Указатели — это, конечно, не массивы, но я считаю, что в большинстве случаев это будет служить цели.

person Sourav Ghosh    schedule 21.01.2016