Это зависит от того, пишете ли вы на C или C ++. Я предполагаю, что C, как и для C ++, лучше использовать std :: vector, а не массив.
В Си это зависит от того, какую версию вы используете. Если и только если вы используете стандартный компилятор C99, то массив может взять свой размер из переменной во время выполнения, как вы делаете здесь, иначе размер должен быть определен во время компиляции. Visual Studio не поддерживает динамический массив - см. MSDN
C ++ использует стандарт C89, поэтому требует, чтобы размер был установлен во время компиляции.
Так что в вашем случае вам нужно посмотреть, какие флаги вы передали компилятору.
Как отметил @Eric, код на C ++, поэтому работающий компилятор использует нестандартное расширение, поэтому для gnu я бы добавил flags для обеспечения соблюдения стандарта, например. -ansi или -std = c ++ 98 и -pedantic