I don't really understand why I can't have a variable size array on the stack, so something like
foo(int n) {
int a[n];
}
As I understand the stack(-segment) of part of the data-segment and thus it is not of "constant size".
Variable Length Arrays(VLA) are not allowed in C++ as per the C++ standard.
Many compilers including gcc support them as a compiler extension, but it is important to note that any code that uses such an extension is non portable.
C++ provides std::vector for implementing a similar functionality as VLA.
There was a proposal to introduce Variable Length Arrays in C++11, but eventually was dropped, because it would need large changes to the type system in C++. The benefit of being able to create small arrays on stack without wasting space or calling constructors for not used elements was considered not significant enough for large changes in C++ type system.