【问题标题】:Why can't I create an array of size n? [duplicate]为什么我不能创建一个大小为 n 的数组? [复制]
【发布时间】:2011-07-19 02:51:56
【问题描述】:

可能重复:
Why can't I create an array with size determined by a global variable?

这是一个大小为4的简单数组的定义,存储在堆栈内存中:

int array[4];

现在,如果我想在堆栈中声明动态大小的数组,我似乎应该编写以下代码:

int n;
cin >> n;
int array[n];

但我们知道这在 C++ 中是不允许的,我们可以编写这个,它将在动态内存(即堆)中创建数组:

int n;
cin >> n;
int *array = new int[n];

但这更慢并且(因为使用了 new 运算符)并且需要在我们完成数组工作后调用 delete [] 运算符。

所以我的问题就在这里:

  • 为什么 C++ 不允许您在堆栈内存中创建动态长度数组?

【问题讨论】:

    标签: c++ arrays memory


    【解决方案1】:

    C99 确实允许可变长度数组 (VLA); C89 没有。

    void function(int n)
    {
        int array[n];
        ...
    }
    

    C++ (98, 03) 不像 C99 那样允许 VLA,但它有向量和相关类型,在许多方面都更好。

    【讨论】:

    • 我知道这一点。但问题是“为什么?”
    • @Mihran:因为原始 C 的设计者认为没有必要,并且 C++ 从 C 继承了该限制。然后 C 在 C99 中进行了调整以允许它 - 而 C++ 尚未效仿和 AFAIK,即使是 C++0x 标准也不会添加该功能。并非所有 C 编译器(尤其不是 MSVC)都在允许 VLA 的范围内支持 C99。忽略支持的最初原因可能是为 VLA 提供复杂的编译器,必须硬塞到 64 KB 内存中,并且对它的需求不足;动态分配的数组适用于许多人。
    【解决方案2】:

    没有称为 C/C++ 的语言。自 1999 年以来,C 就允许使用可变长度数组 (VLA),而 C++ 则不允许。

    回答“为什么”的问题 - C++ 标准体无论出于何种原因都没有将 VLA 包含到 C++ 标准中。

    【讨论】:

      【解决方案3】:
      int n;
      cin >> n;
      int array[n];
      

      在 C++ 中,必须在编译时知道数组的大小。但是在您的代码中,大小将在运行时知道。这是语言不允许的!

      【讨论】:

      • 问题是“为什么会有这样的要求?”
      【解决方案4】:
      int n;
      cin >> n;
      int array[n];
      

      如果使用 g++,这将起作用。 g++ 支持 VLA 作为扩展。然而 ISO C++ 要求数组的大小是一个常量表达式,即大小必须在编译时知道。

      为什么 C++ 不允许你在栈内存中创建动态长度的数组?

      简单的回答“因为标准是这样说的”。甚至即将发布的 C++ 标准 (C++0x) 也不允许使用可变长度数组。

      顺便说一句,我们在 C++ 中总是有 std::vector。所以没有理由担心。 :)

      【讨论】:

      • +1 我不知道这个。
      • 当你提前知道n时,使用数组通常效率更高,但你必须像指针一样创建它并使用malloc()或alloca()。你可以使用像数组这样的指针。
      【解决方案5】:

      除了其他答案:
      我的猜测是 C++ 标准板认为 C 风格的数组已经过时,evil,并提倡使用std::vector(它设计了这个特性)。

      【讨论】:

        猜你喜欢
        • 2016-06-20
        • 2015-10-01
        • 1970-01-01
        • 2017-03-28
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-08
        相关资源
        最近更新 更多