C++ 为什么C++;编译器是否允许在编译时在堆栈上创建大小未知的数组?

C++ 为什么C++;编译器是否允许在编译时在堆栈上创建大小未知的数组?,c++,gcc,stack,C++,Gcc,Stack,我试图理解在编译时在堆栈上创建未知大小的数组时会发生什么。让我们考虑一下这个代码: int main() { int x; cin >> x; int tab[x]; } 我发现了很多关于这个说法的信息,你不能在栈中创建一个未知大小的数组,但是我没有发现任何信息,为什么C++编译器允许它,或者他们中的一些人可以做?创建这样的数组时会发生什么?它是在堆栈上创建的还是已经在堆上创建的 GCC编译器是否有一些选项可以打开,因为这样的构造将被视为错误或至少是警告?

我试图理解在编译时在堆栈上创建未知大小的数组时会发生什么。让我们考虑一下这个代码:

int main()
{
    int x;
    cin >> x;

    int tab[x];
}
<>我发现了很多关于这个说法的信息,你不能在栈中创建一个未知大小的数组,但是我没有发现任何信息,为什么C++编译器允许它,或者他们中的一些人可以做?创建这样的数组时会发生什么?它是在堆栈上创建的还是已经在堆上创建的


GCC编译器是否有一些选项可以打开,因为这样的构造将被视为错误或至少是警告?

C++不允许可变长度数组(VLA)

然而,最新的C标准确实如此,因此有时可以将其作为一个扩展,比如GCC


编译时,请确保显式选择一种语言(如果可以,请选择C++17或更高版本),并要求进行迂腐(严格符合标准)的行为 STD::vector < /Cord>”。BTW不被称为“表”,但是数组和 x>代码>不是“未知”,它只是在编译时未知,但是一旦用户输入了一个数字,就可以创建一个大小数组(如果你想写标准C++,就不这样写)。我不明白为什么这个问题被否决了。如果我不知道答案,我也不知道在哪里可以找到更多的信息。而且严格来说,副本不是副本。谢谢。现在我只能使用C++1z,但它仍然允许vla,所以我必须使用这个编译器选项:(-Werror=vla)事实证明,也可以使用标志
-pedantic errors
来代替
-Werror=vla