Почему мне разрешено использовать переменную const, определенную как размер массива в C?

Когда я запускаю следующий код, он отлично работает для C:

#include<stdio.h>

int main(void)
{

const int x=5;
char arr[x];
printf("%d",sizeof(arr));

}

Но я не только прочитал, что const квалифицированные переменные не являются константами real (поэтому они не могут использоваться в case состоянии switch-case), но следующая ссылка из IBM подтверждает, что (IBMLINK) и говорит:

 const int k = 10;
 int ary[k];     /* allowed in C++, not legal in C */

Почему тогда мне разрешено использовать квалифицированную переменную const в C как размер массива без каких-либо ошибок?

Ответ 1

c99 поддерживают массивы переменной длины, но c90 не поддерживает массивы переменной длины, это можно сделать более четко, если вы используете gcc и пытаетесь скомпилировать эти аргументы:

gcc -std=c89 -pedantic

это даст вам следующее предупреждение:

warning: ISO C90 forbids variable length array ‘y’ [-Wvla]

но если вы скомпилируете с помощью c99, это прекрасно:

gcc -std=c99 -pedantic 

Как указано Джоном Боде в отношении стандартных массивов переменной длины 2011 C (VLA), теперь необязательно. Вот статья Dr Dobbs о VLA, а также ссылка на gcc docs, как указал Уэйн Конрад.