В каких версиях стандарта C массивы переменной длины не являются частью языка, обязательны или необязательны? - PullRequest
3 голосов
/ 15 апреля 2019

Рассмотрим следующий код:

#include <stdio.h>

int main(){
    int size,i;
    scanf("%d",&size);
    int x[size];

    for(i=0;i<size;i++){
        x[i] = i;
    }

    for(i=0;i<size;i++){
        printf("%d\n", x[i]);
    }

    return 0;
}

Я думаю, что есть версии, в которых мы не можем объявить массив, используя переменную для определения его размера, как в:

int x[size];

Но я не уверен, какая версия. Это разрешено в так называемом ANSI C?

Ответы [ 3 ]

6 голосов
/ 15 апреля 2019

В C89 / C90 нельзя перемежать объявления и операторы, например помещать объявление (определение) int x[size]; после scanf() - даже если вы измените измерение на постоянную времени компиляции.

В C89 / C90 нельзя использовать массив переменной длины - поэтому определение int x[size]; недопустимо, поскольку size не является постоянной времени компиляции.

Компиляторы C99 должны поддерживать как объявления в (почти) произвольных точках функции (им все еще не может предшествовать метка), так и определения массива переменной длины (VLA).

Компиляторы C11 обязаны поддерживать определения переменных (почти) в любом месте функции. Компиляторы C11 могут дополнительно поддерживать VLA ( §6.10.8.3 Макросы условных объектов и §6.7.6.2 Деклараторы массива ) и должны определять __STDC_NO_VLA__, если они их не поддерживают.

C18 эквивалентен C11 во всех аспектах этого обсуждения.

Только для записи:

  • C89 - ANSI X3.159-1989
  • C90 - это ISO 9899-1990, версия ANSI которого была помечена как "пересмотр и повторное обозначение ANSI X3.159-1989". Основное отличие заключалось в номерах разделов для языка и библиотеки.
  • C99 - это ISO / IEC 9899: 1999
  • C11 - ISO / IEC 9899: 2011
  • C18 - это ISO / IEC 9899: 2018

Конечно, единственная необычная вещь в X3.159-1989 состояла в том, что она была опубликована ANSI до того, как появился стандарт ISO. Однако ANSI также приняла каждый последующий стандарт ISO, как и другие национальные органы по стандартизации, такие как BSI (Британский институт стандартов) и DIN (Немецкий институт стандартизации или Немецкий институт стандартизации).

Была также Поправка 1 (к ISO 9899: 1990), завершенная в 1994 году и опубликованная в 1995 году. Она добавила заголовки и ввела орграфы и внесла другие изменения. Это почти никогда не рассматривается отдельно, особенно сейчас, 25 лет спустя.

Обратите внимание, что GCC рассматривает опцию -ansi как эквивалентную -std=c90, что может привести к путанице в терминологии. Изначально ANSI опубликовала «стандарт ANSI C» примерно за год до того, как выпустила ISO, но намерение всегда заключалось в том, чтобы иметь общий стандарт, и ANSI одобрило стандарт ISO 9899: 1990, когда он был опубликован.

0 голосов
/ 15 апреля 2019

Этот вид массива, называемый массивом переменной длины, был добавлен в C99.Прочитайте эту хорошую статью о современном программировании на C:

https://matt.sh/howto-c

0 голосов
/ 15 апреля 2019

ANSI-C (C89) не позволяет инициализировать массив с помощью переменной.

Например:

  int x = 5;
  int ia[x];

Этот пример недопустим. ANSI-C ограничивает размер инициализации массива постоянным. Однако вы можете использовать макросы для определения длины массива.

Пример:

    #define MAX_ARRAY_SIZE 5
    int ia[MAX_ARRAY_SIZE];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...