Компилятор может использовать эти константы в качестве констант времени компиляции, которые он может хранить в своей таблице символов. Но фактически ни один компилятор не является настолько сложным, чтобы хранить агрегат в его таблице символов, поэтому значение не может использоваться во время компиляции.
Кроме того, нестандартные расширения gcc позволяют использовать автоматические массивы переменной длины.
Вот почему не только это:
const int j[] = { 0, 1, 2, 3 };
float g[j[3]];
но также это разрешено компилятором:
int j[] = { 0, 1, 2, 3 };
float g[j[3]];