代码之家  ›  专栏  ›  技术社区  ›  syaz

是否允许在运行时不进行动态分配的数组大小?

  •  53
  • syaz  · 技术社区  · 16 年前

    我已经使用C++几年了,今天我看到了一些代码,但是这怎么能完全合法呢?

    int main(int argc, char **argv)
    {
        size_t size;
        cin >> size;
        int array[size];
        for(size_t i = 0; i < size; i++)
        {
            array[i] = i;
            cout << i << endl;
        }
    
        return 0;
    }
    

    根据GCC编制。

    如何在运行时确定大小 new malloc ?

    为了再次检查,我在谷歌上搜索了一些和我相似的代码,它们都声称会给出存储大小错误。

    即使Deitel的C++如何在公共编程错误4.5下编程P 261状态:

    只有常量可以用来声明自动数组和静态数组的大小。

    照亮我。

    7 回复  |  直到 8 年前
        1
  •  52
  •   Mehrdad Afshari    16 年前

    这在C99中有效。

    C99标准支持堆栈上的可变大小数组。可能您的编译器也选择了支持这个构造。

    注意这与 malloc new . gcc 在堆栈上分配数组,就像它在 int array[100] 只需调整堆栈指针。未完成堆分配。很像 _alloca .

        2
  •  19
  •   jpalecek    16 年前

    这被称为VLA(可变长度数组)。它在C99中是标准的,但是GCC允许它在C++代码中作为扩展。如果希望它拒绝代码,请尝试 -std=standard , -ansi -pedantic 选项。

        3
  •  6
  •   Özgür    16 年前

    它是 valid 只有在C99。下次您可以尝试在 reliable compiler .

        4
  •  4
  •   anon    16 年前

    它是有效的C99,它是无效的C++。这是这两种语言之间不少不同之处之一。

        5
  •  0
  •   Najeeb    12 年前

    如果您使用的是dev cpp编译器,则可以在中动态地为数组指定大小。 而且没有错误,但是VisualC++和VisualStudio编译器是不可能的。 我认为原因是dev-c++为未初始化的int指定了一个正数 当我们给它一个数字,它就会被给定的数字所取代。 但其他编译器可能会为未初始化的变量提供空值。

        6
  •  0
  •   Sruit A.Suk    9 年前

    此代码在GNUGCC编译器中运行。

    #include<bits/stdc++.h>
    
    int main(int argc, char **argv)
    
    {
        size_t size;
    
       std:: cin >> size;
    
        int array[size];
    
        for(size_t i = 0; i < size; i++)
    
    {
    
    array[i] = i;
    
            std:: cout << i;
    
     }
    
        return 0;
    }
    
        7
  •  -2
  •   Elkvis    10 年前

    可变长度数组(VLAS)在C++ 14标准中得到了支持,最近已被接受,并正在等待公布。

    推荐文章