There is a difference. A VLA is declared almost like any array, a Dynamic array uses malloc/free to allocate the memory. A VLA is different from a standard array in that it doesn't require a compile time constant for it's size. And remember that VLA are only required to be supported in the C99 compiler, they are optional in C11 and not allowed pre-C99. They have never been part of the C++ standards.

Is it true that VLAs, can only exist inside functions? never globally scoped...

Another thing, I notice that you mentioned the malloc/free combo for memory allocation. I thought that the right way to work with memory allocation in C++ was via: new/delete.. Am I right about preferring the latter?

The most glaring problem is that because they have to link with old broken code which is "not prepared to deal with exceptions", they decided to forbid exceptions outright, which means they cannot write meaningful constructors, which means they cannot use C++ resource management, which means they miss out on the main reason C++ exists at all.

There are several other serious problems and simply ridiculous statements ("compiler will do it for you, badly" or "streams are a replacement for printf"), but that's the biggest one. There are a few good points, but the signal-to-noise ratio is pretty bad.

If you're looking for a C++ guide that's useful elsewhere, read a book, such as "C++ coding standards"