Ты наткнулся на расширение языка, специфичное для gcc.
Оно хорошо описано в доках (6.14. Arrays of Variable Length)
Реализуется через неявное использование функции alloca — выделение памяти на стеке.
Обойти можно реализовав подобное поведение руками.