Законна ли такая операция?
Он называется массивом переменной длины.
VLA допустимы в ANSI C99 и являются дополнением к некоторым компиляторам до C99. GCC поддерживает его как строгий C99, так и как расширение кода не-C99. Это также допустимо в C ++ 0x.
Если нет, почему компилятор не выдает никаких предупреждений или ошибок?
С gcc:
$ gcc -std=c89 src/vla.c -Wall -ansi -pedantic
src/vla.c: In function ‘function’:, not dynamic array.
src/vla.c:17: warning: ISO C90 forbids variable length array ‘a’
src/vla.c:21: warning: ISO C90 forbids mixed declarations and code
Наличие conio.h из MSDOS указывает на то, что вы, вероятно, используете компилятор Microsoft Visual C ++, так что не беспокойтесь об этом. MS работает над тем, чтобы сделать их компилятор более совместимым со стандартом C ++ 0x, но не претендует на то, насколько стандартным является режим компилятора C. Вы спрашиваете, почему слов в испанском диалекте нет в словаре французского.
Где будет выделена эта память: стек или куча?
Это автоматический объект, поэтому большинство реализаций C будут помещаться в стек по соображениям эффективности.
Почему ANSI C / GCC позволяет это
Это полезно для создания временных массивов переменного размера во время выполнения, время жизни которых не выходит за пределы вызова функции.