我们可以在 C++ 中创建可变长度数组吗

Posted

技术标签:

【中文标题】我们可以在 C++ 中创建可变长度数组吗【英文标题】:Can we create variable length arrays in c++ 【发布时间】:2016-01-24 05:11:14 【问题描述】:

我正在尝试创建这个简单的程序,它将数组的数据再次显示给用户。我想创建一个可变长度的数组。在这个程序中,首先询问用户数组元素的数量,然后是数据。

问题在于,在某些 IDE 中,此代码运行完全正常,但在其他 IDE 中,它给出了不允许可变长度数组的错误......那么什么是正确的?

void main()

    int t;
    cin>>t;
    int ar[t];
    for(int i=0;i<t;i++)
    
        cin>>ar[i];
    

    for(int i=0;i<t;i++)
    
        cout<<ar[i]<<"\t";
    

例如。这在 Turbo C++ 中不起作用...但在此 IDE 中运行 http://www.tutorialspoint.com/compile_cpp11_online.php

https://www.codechef.com/ide

【问题讨论】:

当你有 std::vector 时,VLA 在 C++ 中有点毫无意义。可以说 std::vector 甚至更好,因为它引起了人们对动态分配内存而不是静态分配内存的关注(以及更安全的类型)。 【参考方案1】:

标准 C++ 不支持可变长度数组。一些实现将其作为扩展提供,但正如您已经发现的那样,依赖它们会导致代码不可移植。

我建议您改用std::vector。它适用于纯标准 C++。

int size;
if (!(std::cin >> size) || (size < 0))
  throw std::invalid_argument "bad size";
std::vector<int> numbers (size);

在 GCC 和 Clang 中,您可以使用 -pedantic 编译器开关来关闭任何非标准扩展。这将帮助您避免意外编写不可移植的代码。当然,你也应该用-Wall-Wextra-Werror编译。

【讨论】:

VLA 是在 C++14 中悄悄添加的。 @5gon12eder 实际上我还没有被介绍过..我会尝试研究它..非常感谢您! @Blrfl 你能引用哪里吗? @NathanOliver:我的错误:N3639 是 adopted into the draft,但从未制作过最终版本。有趣的是,我试过的几个编译器的 c++1x 和 c++14 模式都没有抱怨。 @Blrfl GCC 允许 VLA 作为非标准扩展。我不确定clang是否这样做。 MSVS 根本不允许它们。

以上是关于我们可以在 C++ 中创建可变长度数组吗的主要内容,如果未能解决你的问题,请参考以下文章

c++中有可变长度数组吗?

OpenCL中不允许使用可变长度数组声明 - 为什么?

我们可以有一个可变长度数组类型的结构元素吗? [复制]

为啥我可以在 C++ 中定义这个可变长度数组? [复制]

在 C++ 中声明可变长度二维数组的正确方法

在 MS Visual C++ 中启用 VLA(可变长度数组)?