Предел массива 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.

Установка флага std=c99 в GCC

int *arr=malloc( limit*sizeof(int) );

Это выделит достаточно памяти в куче для вашего массива limitint"S. Но этот массив будет "динамическим" (размер задается во время выполнения), и он будет отвечать за:freeЭто воспоминание, когда оно вам больше не нужно. Ваша переменная arr будет просто указателем на эту память.int arr1[10]; с другой стороны, отделить пространство памяти для 10 int в стеке, и ваша переменная arr1 это память. Компилятору нужно знать размер. Если вы прошли мимо функции, принимающей int* это будет "распадаться" на int*, то есть указатель на первый элемент arr1[0].

Другие вопросы по тегам