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
.
You are allocating the array at compile-time, so the compiler has to know the array's size in advance. You have to declare
siz
as a constant expression before you declarearr
, for instance:or
Alternatively, if you need to determine its size in run-time, you can allocate it on the heap by using
malloc
:EDIT: as eddieantonio has mentioned, my answer is valid for C89. In C99 it is allowed to declare arrays of variable size.
You cannot declare a
static
array of variable size because its space is allocated in the Data Segment (or bss segment in case of an uninitialized variable). Hence the compiler needs to know the size at the compile time and will complain if the size is not a constant.The underlying reason for this is the Data Segment size contributes to the size of the executable being generated, which obviously is created at compile time, and hence has to be fixed.
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
orextern
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
So if you want a dynamic size array with
static
storage specifier you will have to use a dynamic array allocated on heap.EDIT:
To answer your updated question:
When you remove the
static
keyword from the declaration, the storage specifier of the declared array changes fromstatic
to global, note the standard quote above, it clearly mentions the restriction that VLAs are not allowed withstatic
andextern
storage specification. Clearly, you are allowed to have an VLA with global storage specification, which is what you have once you remove thestatic
keyword.You can't define any array of variable size. That's because
arr[siz]
makes the compiler (!) allocate memory for your array (well, the compiler creates a program, that .., but let's not stray into details). However, variables can be changed at runtime (!) which means the compiler has no chance of knowing how much memory to allocate.What you can do is
These lines result in a program that allocates memory at runtime, therefore it's exact size may be defined at runtime as well.