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

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

#include<stdio.h>

int size = 5;

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

    return 0;
}

Ошибку компиляции показывают как

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

Согласно мне, массив должен быть инициализирован size.

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

20
задан nbro 19 March 2016 в 17:41
поделиться

6 ответов

В C99, 6.7.8 / 3:

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

6.6 / 2:

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

6.6 / 6:

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

6.7.5.2/4:

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

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

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

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

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

#define size 5

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

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;
}

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

22
ответ дан 29 November 2019 в 23:33
поделиться
#include<stdio.h> 

/* 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 не допускает переменную размер массивов.

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

const int size=5;  

позволяет

int a[size]={1,2,3,4,5}; 
0
ответ дан 29 November 2019 в 23:33
поделиться

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

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

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

int size = sizeof(a) / sizeof(a[0]);
9
ответ дан 29 November 2019 в 23:33
поделиться

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

#define size 5
6
ответ дан 29 November 2019 в 23:33
поделиться

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

3
ответ дан 29 November 2019 в 23:33
поделиться

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

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

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

Редактировать: Вы можете узнать больше о стандарте C99 здесь... и здесь....

3
ответ дан 29 November 2019 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: