Почему этот код выходит из строя при доступе к элементу массива переменной длины?

#c #variable-length-array

#c #массив переменной длины

Вопрос:

Если я хочу указать 10 элементов, я сканирую how_many как 10.

Но как только я ввожу третье значение, программа завершает работу и возвращает некоторое длинное отрицательное значение. Я не знаю, в чем проблема.

 int main()
{
    int how_many,k;
    int data[how_many];

    printf("Enter the number of values to be sorted..: ");
    scanf("%d",amp;how_many);
    printf("Enter the values one by one..:n");

    for (k=0;k<how_many;k  )
    {
        scanf("%d",amp;data[k]);
        printf("data[%d]=%dn",k,data[k]);
    }

    return 0;
}
  

Ответ №1:

При определении int data[how_many] переменная how_many по-прежнему неинициализирована.

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

 int how_many,k;

printf("Enter the number of values to be sorted..: ");
if ( scanf("%d",amp;how_many) amp;amp; how_many > 0 )
{
    int data[how_many];
    /* ... */
}
  

Но VLAS (массивы переменной длины) немного опасны: что, если пользователь вставит 2000000000? Вам также придется проверить наличие разумного максимального значения:

 #define MAX 1000

/* ... */

if ( scanf("%d",amp;how_many) amp;amp; how_many > 0 amp;amp; how_many <= MAX )
{
    int data[how_many];
    /* ... */
}
  

Вот почему VLAS, которые были удалены из стандарта начиная с C11, не являются лучшим выбором в этом сценарии. Я предлагаю просто определить массив статически

  int data [MAX];
  

Или динамически:

 int *data = malloc ( MAX * sizeof( int ) );