Предел массива Scanf в C?
У меня есть небольшая ошибка в C:
Ошибка: выражение должно иметь постоянное значение
Я знаю, это означает, что мой лимит должен иметь постоянное значение, но как я могу решить это, когда у меня такая ситуация?
printf("Type limit: ");
scanf("%i",&limit);
int arr[limit];
Благодарю.
РЕДАКТИРОВАТЬ:
Хорошо, ребята, еще одна проблема, извините, если я спам.
int num,limit,i;
printf("Type limit: ");
scanf("%i",&limit);
int *arr = (int*)malloc(limit*sizeof(int));
for(i=0;i<limit;i++)
{
printf("Type num %i: ",i);
arr[i] = scanf("%i",&num);
}
system("pause");
return 0;
ошибка 4 ошибка c2109 нижний индекс требует массив или тип указателя
4 ответа
Вы должны использовать malloc
:
printf("Type limit: ");
scanf("%i",&limit);
int *arr = malloc(sizeof(int) * limit);
Массивы переменной длины с автоматическим хранением разрешены начиная с C99. В C89 невозможно выделить массив с автоматической продолжительностью хранения, размер которого неизвестен во время компиляции. использование malloc
выделить его динамически:
printf("Type limit: ");
scanf("%i", &limit);
int* arr = malloc(limit * sizeof(int));
и не забудьте позвонить free(arr)
чтобы освободить эту память, когда она вам больше не нужна.
На ваш вопрос об инициализации этого массива значениями, считываемыми из stdin в цикле:
for(i = 0; i < limit; ++i)
arr[i] = scanf("%i", &num);
читает каждое значение, сохраняет его в num
переменная, а затем 1
назначен в arr[i]
поскольку scanf
возвращает "количество элементов ввода, успешно сопоставленных и назначенных" (в данном случае это 1). Вы можете читать в элементы массива напрямую:
for(i = 0; i < limit; ++i)
scanf("%i", &arr[i]);
C89 и более ранние версии C не поддерживали размеры массивов во время выполнения. Вам нужно включить поддержку C99 (или новее) в вашем компиляторе.
Если вы используете Linux, вы можете ввести:
gcc -std=c99
или же
c99
скомпилировать код, написанный для c99.
int *arr=malloc( limit*sizeof(int) );
Это выделит достаточно памяти в куче для вашего массива limit
int
"S. Но этот массив будет "динамическим" (размер задается во время выполнения), и он будет отвечать за:free
Это воспоминание, когда оно вам больше не нужно. Ваша переменная arr будет просто указателем на эту память.int arr1[10];
с другой стороны, отделить пространство памяти для 10 int
в стеке, и ваша переменная arr1
это память. Компилятору нужно знать размер. Если вы прошли мимо функции, принимающей int*
это будет "распадаться" на int*,
то есть указатель на первый элемент arr1[0].