31

I always thought that when declaring an array in C++, the size has to be a constant integer value.

For instance:

int MyArray[5]; // correct

or

const int ARRAY_SIZE = 6;
int MyArray[ARRAY_SIZE]; // correct

but

int ArraySize = 5;
int MyArray[ArraySize]; // incorrect

Here is also what is explained in The C++ Programming Language, by Bjarne Stroustrup:

The number of elements of the array, the array bound, must be a constant expression (§C.5). If you need variable bounds, use a vector(§3.7.1, §16.3). For example:

  void f(int i) {
      int v1[i];          // error : array size not a constant expression
      vector<int> v2(i);  // ok
  }

But to my big surprise, the code above does compile fine on my system!

Here is what I tried to compile using GCC v4.4.0:

void f(int i) {
    int v2[i];
}

int main() {
    int i = 3;
    int v1[i];
    f(5);
}

Success?!?

Is there something I'm missing?

Deduplicator
  • 44,692
  • 7
  • 66
  • 118
Jérôme
  • 26,567
  • 29
  • 98
  • 120
  • 18
    And this is why testing something with a compiler doesn't mean anything in terms of code correctness. – GManNickG May 19 '10 at 06:37
  • 2
    Duplicate of http://stackoverflow.com/questions/737240/c-c-array-size-at-run-time-w-o-dynamic-allocation-is-allowed – nico May 19 '10 at 06:40

2 Answers2

32

This is a GCC extension to the standard:

You can use the -pedantic option to cause GCC to issue a warning, or -std=c++98 to make in an error, when you use one of these extensions (in case portability is a concern).

Deduplicator
  • 44,692
  • 7
  • 66
  • 118
Dean Harding
  • 71,468
  • 13
  • 145
  • 180
  • 1
    Using `-std=c++98` doesn't help, that doesn't disable the extension. Use `-pedantic` for a warning or `-pedantic-errors` for an error – Jonathan Wakely Dec 13 '18 at 12:36
6

You are using a feature from C99 which is called VLA(variable length arrays). It would be better if you compile your program like this:

g++ -Wall -std=c++98 myprog.cpp
Khaled Alshaya
  • 94,250
  • 39
  • 176
  • 234