Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run time C++ array initialization question

Tags:

c++

c

Why can't we initialize array size using non-const size in global area....outside main() ....

//outside main - global
int val=5;
int arr[val];

int main()
{

}

this gives error

7:12: error: array bound is not an integer constant before ']' token
 In function 'int main()':

But if i move this same code inside main/body of function error disappears....

there is no error and it compiles fine...

int main()
{
   int val=5;
   int arr[val];
}

Also this works fine inside body of a function

void fn(int val)
{
    int arr[val];
}

int main()
{

fn(5);

}

Confused and how does moving array size can't be intialized only outside main?

like image 714
Puttaraju Avatar asked Sep 16 '26 02:09

Puttaraju


1 Answers

The first sample, at file scope

int val=5;
int arr[val];

int main()

is illegal on both C and C++. Variables at file scope must be defined (created) before their first use, and continue to exist until the program ends - which also means that, once created, an array cannot be resized. In the case of arrays, this means (among other things) that their dimension must be known at compile time. Using a variable as an array dimension runs afoul of the need for the size of a static to be known at compile time - for example, the value of val could be changed at run time (e.g. in main()) which will be AFTER arr is created.

The second example

void fn(int val)
{
     int arr[val];
}

is legal in C (from 1999), because arr is of automatic (not static) storage duration. It will be created when the function body is entered, and cease to exist when the function returns. This is called a "variable length array" or VLA, because the number of elements is determined by a value of a variable (val) at run time.

VLAs were also not supported before the 1999 C standard.

In C++, VLAs are illegal. Period. However, some C++ compilers do support such a feature as a non-standard extension. In C++, rather than using arrays, a standard container (e.g. std::vector<int>) is preferred for various reasons, including ability to resize it at run time.

like image 96
Peter Avatar answered Sep 18 '26 16:09

Peter



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!