Why can't the size of a static array be made variable?
arrays, c, gcc, static
Solution
Since the size of the array you declare is not constant, what you have is an Variable Length Array(VLA). VLA are allowed by the c99 standard but there are some limitations associated with it. You cannot have an variable length array with `static` or `extern` storage class specifier.
You have an VLA with `static` storage specification and it is not allowed by the C99 Standard.
Reference:
c99 Standard: 6.7.5.2/8
EXAMPLE 4 All declarations of variably modified (VM) types have to be at either block scope or function prototype scope. Array objects declared with the static or extern storage class specifier cannot have a variable length array (VLA) type. However, an object declared with the static storage class specifier can have a VM type (that is, a pointer to a VLA type). Finally, all identifiers declared with a VM type have to be ordinary identifiers and cannot, therefore, be members of structures or unions.
So if you want a dynamic size array with `static` storage specifier you will have to use a dynamic array allocated on heap.
#define MAX_SIZE 256
static int* gArr;
gArr = malloc(MAX_SIZE * sizeof(int));
EDIT: To answer your updated question: When you remove the `static` keyword from the declaration, the storage specifier of the declared array changes from `static` to global, note the standard quote above, it clearly mentions the restriction that VLAs are not allowed with `static` and `extern` storage specification. Clearly, you are allowed to have an VLA with global storage specification, which is what you have once you remove the `static` keyword.
Problem
Related but not quite duplicate as it discusses C++: can we give size of static array a variable I am defining an array in one of the child files as follows. ``` static int arr[siz]; ``` Here `siz` is a global variable available to the child file. But the gcc compiler produces the following error : ``` <filename>: <line_num> : error : storage size of ‘arr’ isn’t constant ``` Why can't I define a `static` array of variable size ? EDIT : This seems to be a problem only for `static int` type. If I change the variable type of `arr` from `static int` to `int`, the error goes away, even though the size of array is still dependent on a variable `siz`.