Why can't I create an array with size determined by a global variable?
In C99, 6.7.8/3:
The type of the entity to be initialized shall be an array of unknown size or an object type that is not a variable length array type.
6.6/2:
A constant expression can be evaluated during translation rather than runtime
6.6/6:
An integer constant expression shall have integer type and shall only have operands that are integer constants, enumeration constants, character constants, sizeof expressions whose results are integer constants, and floating constants that are the immediate operands of casts.
6.7.5.2/4:
If the size is an integer constant expression and the element type has a known constant size, the array type is not a variable length array type; otherwise, the array type is a variable length array type.
a
has variable length array type, because size
is not an integer constant expression. Thus, it cannot have an initializer list.
In C90, there are no VLAs, so the code is illegal for that reason.
In C++ there are also no VLAs, but you could make size
a const int
. That's because in C++ you can use const int
variables in ICEs. In C you can't.
Presumably you didn't intend a
to have variable length, so what you need is:
#define size 5
If you actually did intend a
to have variable length, I suppose you could do something like this:
int a[size];
int initlen = size;
if (initlen > 5) initlen = 5;
memcpy(a, (int[]){1,2,3,4,5}, initlen*sizeof(int));
Or maybe:
int a[size];
for (int i = 0; i < size && i < 5; ++i) {
a[i] = i+1;
}
It's difficult to say, though, what "should" happen here in the case where size != 5. It doesn't really make sense to specify a fixed-size initial value for a variable-length array.
You don't need to tell the compiler what size the array is if you're giving an initializer. The compiler will figure out the size based on how many elements you're initializing it with.
int a[] = {1,2,3,4,5};
Then you can even let the compiler tell you the size by getting the total size of the array in bytes sizeof(a)
and dividing it by the size of one element sizeof(a[0])
:
int size = sizeof(a) / sizeof(a[0]);
The compiler cannot assume that the value of size is still 5 by the time main() gets control. If you want a true constant in an old-style C project, use:
#define size 5