代码之家  ›  专栏  ›  技术社区  ›  Jérôme

用非常量变量声明数组大小

  •  27
  • Jérôme  · 技术社区  · 14 年前

    我一直认为,在C++中声明数组时,大小必须是一个常量整数值。

    例如:

    int MyArray[5]; // correct
    

    const int ARRAY_SIZE = 6;
    int MyArray[ARRAY_SIZE]; // correct
    

    但是

    int ArraySize = 5;
    int MyArray[ArraySize]; // incorrect
    

    这里也解释了 The C++ Programming Language, by Bjarne Stroustrup :

    数组元素的数目(数组界限)必须是常量表达式(_§C.5)。 如果需要变量边界,请使用向量(_§3.7.1,_§16.3)。例如:

    void f(int i) { 
       int v1[i];          // error : array size not a constant expression
       vector<int> v2(i);  // ok 
    } 
    

    但令我吃惊的是,上面的代码在我的系统上编译得很好!

    以下是我试图编译的内容:

    void f(int i) {
       int v2[i];
    }
    
    int main()
    {
       int i = 3;
       int v1[i];
       f(5);
    }
    

    我没有错误! 我使用的是GCC v4.4.0。

    我有什么东西不见了吗?

    3 回复  |  直到 6 年前
        1
  •  27
  •   Dean Harding    14 年前

    这是对标准的GCC扩展: see here .

    你可以使用 -pedantic 使GCC发出警告的选项,或 -std=c++98 当您使用这些扩展时(在可移植性是一个问题的情况下),会产生错误。

        2
  •  5
  •   Khaled Alshaya    14 年前

    您使用的是C99的一个功能,称为VLA(可变长度数组)。这样编译程序会更好:

    g++ -Wall -std=c++98 myprog.cpp
    
        3
  •  0
  •   Dmytro Dadyka    6 年前

    您还可以使用alloca函数获得类似的效果 可变长度数组。它也可以在vs上使用。

    alloca -分配自动释放的内存。这个 alloca()函数 在堆栈帧中分配空间大小字节 打电话的人。当 调用alloca()的函数返回到其调用方。分配() 函数是 依赖于机器和编译器 . 对于某些 应用中,它的使用比使用效率高 malloc(3)加上free(3)。