Почему делает массив 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
.
И каков был бы ответ, если я настаиваю на том, чтобы использовать глобальную переменную (если это возможно)?
В 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. На самом деле нет смысла указывать фиксированный размер начальное значение для массива переменной длины.
#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};
Вам не нужно сообщать компилятору, какой размер массива, если вы указываете инициализатор. Компилятор определит размер в зависимости от того, сколько элементов вы его инициализируете.
int a[] = {1,2,3,4,5};
Затем вы даже можете позволить компилятору сообщить вам размер, получив общий размер массива в байтах sizeof (a)
и разделив его на размер одного элемента sizeof (a [ 0])
:
int size = sizeof(a) / sizeof(a[0]);
Компилятор не может Предположим, что значение size все еще равно 5 к тому времени, когда main () получит управление. Если вам нужна истинная константа в проекте C старого стиля, используйте:
#define size 5
size
- это переменная, и C не позволяет вам объявлять ( edit: C99 позволяет вам объявлять их, но не инициализировать их, как вы делаете) массивы с таким переменным размером. Если вы хотите создать массив, размер которого является переменной, используйте malloc или сделайте размер постоянным.
Похоже, что ваш компилятор не соответствует C99... кстати говоря, какой компилятор вы используете? Если это gcc, то вам нужно передать переключатель '-std=c99'.... если вы используете компилятор до C99, то это утверждение незаконно, если это так, сделайте следующее:
int main() { int a[5]={1,2,3,4,5}; printf("%d",a[0]); return 0; }
В стандартных компиляторах до C99 используйте константу вместо переменной.
Редактировать: Вы можете узнать больше о стандарте C99 здесь... и здесь....