Why should global array size be an integer constant?

Both examples are ill-formed in C++. If a compiler does not diagnose the latter, then it does not conform to the standard.

Why there is a different behaviour here?

You use a language extension that allows runtime length automatic arrays. But does not allow runtime length static arrays. Global arrays have static storage.

In case you are using GCC, you can ask it to conform to the standard by using the -pedantic command line option. It is a good idea to do so in order to be informed about portability problems.


The size of an array must be a constant. You can fix this by declaring y as const.

const int y=5;
int arr[y]; 

As for why this worked in main, g++ does allow a variable length array in block scope as an extension. It is not standard C++ however.