为什么C++函数可以创建可变长度的数组?

cor*_*zza 5 c++ memory arrays integer function

根据这个答案,其中指出:

编译器知道int类型的大小,因此可以生成正确的汇编程序指令,该指令将在堆栈上保留足够的空间,以便让foo存在.

编译器需要知道函数将在堆栈上占用的大小才能实现它.

那么,为什么这段代码会编译?

int f(int n)
{
    int x[n];
}

int main()
{
    f(3);
    f(5);
    //etc
}
Run Code Online (Sandbox Code Playgroud)

x 是一个整数数组,但它的大小不是常量,它可以在调用函数的任何时候改变.

我在这里错过了什么?

And*_*owl 8

这不是标准C++中的合法代码.它由编译器特有的扩展编译,支持可变长度数组,这是一个C99功能.

但同样,这不是可移植的C++.如果需要动态调整大小,可以这样重写函数:

#include <vector>

int f(int n)
{
    std::vector<int> v(n);
}
Run Code Online (Sandbox Code Playgroud)

否则,将其设为模板并以这种方式编写:

#include <array>

template<std::size_t N>
int f()
{
    std::array<int, N> a;
}
Run Code Online (Sandbox Code Playgroud)