Почему я не могу создать массив с размером, определяемым глобальной переменной?

Почему массив не инициализируется глобальным size переменной?

 #include int size = 5; int main() { int a[size] = {1, 2, 3, 4, 5}; printf("%d", a[0]); return 0; } 

Ошибка компиляции показана как

объект с переменным размером не может быть инициализирован

По мне, массив должен получить инициализацию по size .

И каков будет ответ, если я буду настаивать на использовании глобальной переменной (если это возможно)?

В C99, 6.7.8 / 3:

Тип инициализируемого объекта должен быть массивом неизвестного размера или типа объекта, который не является типом массива переменной длины.

6.6 / 2:

Постоянное выражение может быть оценено во время трансляции, а не во время выполнения

6.6 / 6:

Целочисленное константное выражение должно иметь целочисленный тип и должно иметь только операнды, которые являются целыми константами, константами enums, символьными константами, sizeof выражениями, результаты которых являются целыми константами, и плавающие константы, которые являются непосредственными операндами приведения.

6.7.5.2/4:

Если размер представляет собой целочисленное константное выражение, а тип элемента имеет известный постоянный размер, тип массива не является массивом переменной длины; в противном случае тип массива представляет собой тип массива переменной длины.

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

В C90 нет VLA, поэтому по этой причине код является незаконным.

В C ++ также нет VLA, но вы можете сделать size const int . Это потому, что в C ++ вы можете использовать переменные const int в ICE. В C вы не можете.

Предположительно, вы не намеревались иметь переменную длину, так что вам нужно:

 #define size 5 

Если вы действительно намеревались иметь переменную длину, я полагаю, вы могли бы сделать что-то вроде этого:

 int a[size]; int initlen = size; if (initlen > 5) initlen = 5; memcpy(a, (int[]){1,2,3,4,5}, initlen*sizeof(int)); 

Или, может быть:

 int a[size]; for (int i = 0; i < size && i < 5; ++i) { a[i] = i+1; } 

Трудно сказать, однако, что «должно» произойти здесь в случае, когда размер! = 5. На самом деле нет смысла указывать начальное значение фиксированного размера для массива переменной длины.

Вам не нужно сообщать компилятору, какой размер массив, если вы даете инициализатор. Компилятор определит размер, основанный на том, сколько элементов вы его инициализируете.

 int a[] = {1,2,3,4,5}; 

Тогда вы даже можете позволить компилятору рассказать вам размер, получив общий размер массива в байтах sizeof(a) и разделив его на размер одного элемента sizeof(a[0]) :

 int size = sizeof(a) / sizeof(a[0]); 

Компилятор не может предположить, что значение размера все равно 5 к моменту, когда main () получает контроль. Если вам нужна настоящая константа в проекте C старого стиля, используйте:

 #define size 5 

size – это переменная, и C не позволяет вам объявлять ( редактировать: C99 позволяет объявлять их, просто не инициализировать их, как вы делаете) массивы с переменным размером, подобным этому. Если вы хотите создать массив, размер которого является переменной, используйте malloc или сделайте размер константой.

Похоже, что ваш компилятор не совместим с C99 … говоря о котором, какой компилятор вы используете? Если это gcc, вам нужно передать переключатель «-std = c99» …. если вы используете компилятор pre-C99, это утверждение является незаконным, если это так, выполните следующее:

 int main () { 
    int a [5] = {1,2,3,4,5}; 
    Е ( "% d", а [0]); 
    return 0; 
 }

В стандартных компиляторах pre-C99 используйте константу вместо переменной.

Изменить: вы можете узнать больше о стандарте C99 здесь … и здесь …

Компилятор должен знать размер массива, объявляя его. Поскольку размер массива не изменяется после его объявления. Если вы поместите размер массива в переменную, вы можете себе представить, что значение этой переменной изменится при выполнении программы. В этом случае компилятор будет вынужден выделить дополнительную память для этого массива. В этом случае это невозможно, так как массив представляет собой статическую структуру данных, выделенную в стеке. Надеюсь, это поможет.

 #include /* int size=5; */ #define size 5 /* use this instead*/ /*OR*/ int a[size]={1,2,3,4,5}; /* this*/ int main() { int a[size]={1,2,3,4,5}; printf("%d",a[0]); return 0; } 

int size означает, что size является переменной, а C не позволяет массивы переменных size .

Я использую VS2008, где

 const int size=5; 

позволяет

 int a[size]={1,2,3,4,5}; 
  • Как обновить несколько элементов массива в mongodb
  • Массив общей длины массива для C?
  • JavaScript - почему Array.prototype.fill фактически заполняет «указатель» объекта при заполнении чего-либо типа «новый объект ()»
  • Чтение строк из файла в массив Bash
  • Java Arrays.asList на примитивном типе массива создает неожиданный тип списка
  • Swift 3.0: ошибка компилятора при вызове глобальной func min (T, T) в массиве или расширении словаря
  • Получить JSONArray без имени массива?
  • Поместить и получить массив String из общих настроек
  • Проверьте, содержит ли строка значение в массиве
  • Как получить уникальные значения из массива
  • Как разбирать массив JSON с помощью Gson
  • Давайте будем гением компьютера.