在c ++中声明基于函数参数的本地数组

时间:2011-11-27 00:44:54

标签: java c++

我从一本书中读到,说下面的c ++代码不应该编译:

  void f(int n, int m){
     int a[n] , b[n][m];
  }

因为在编译时没有确定数组的大小。

但我试了一下,发现无论函数是全局函数还是成员函数,我都可以使用g ++编译成功。

这个东西在最近的c ++实现中是否合法,或者这本书是完全错误的。

谢谢。

修改

我立刻看到了一些回复。我在Java中也有这个奇迹。我注意到在java中,这是受支持的(如果这也取决于版本,请纠正我)。为什么差异呢?它与使用引用与对象有什么关系吗?但是,在java中,我可以从基元的函数参数声明一个具有可变长度的数组。

修改2

以下Java代码确实编译过,如果你说它不应该编译:

class Test1 {
    public int[] f(int n,int k){
        int[] c=new int[n];
        Arrays.fill(c, k);
        return c;
    }
}

3 个答案:

答案 0 :(得分:7)

这些被称为Variable Length Arrays。它们不允许使用C ++。但是一些编译器(例如GCC)支持它们作为扩展。

在C99中,允许使用可变长度数组。

编辑:

对于你的新问题。这个问题的最佳答案解释了为什么C ++没有可变长度数组。

Why no variable size array in stack?

编辑2:

在Java中,数组是存储在堆而不是调用堆栈上的对象。因此问题没有实际意义 - 所有数组都在堆上,因此不存在VLA。

答案 1 :(得分:6)

这是一个GCC扩展 - 大多数其他C ++编译器都不允许这样做。

答案 2 :(得分:2)

正如其他人所提到的那样,它们在C99中被称为可变长度数组,但在C ++中它们是允许的,除非通过GCC扩展,如果你希望你的代码是可移植的,你不应该使用它。

在C ++中,要使用在运行时间之前无法知道其大小的数组(类似对象),请使用std::vectornew[] / delete[]