声明一个基于函数参数的局部数组在c++中是合法的

Is declaring a local array based on function arguments legal in c++

本文关键字:数组 局部 c++ 函数 一个 于函数 声明 参数      更新时间:2023-10-16

我从一本书上读到下面的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;
    }
}

这些被称为可变长度数组。它们在c++中是不允许的。但是有些编译器(比如GCC)将它们作为扩展来支持。

C99允许使用可变长度数组

编辑:

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

为什么堆栈中没有可变大小的数组?

编辑2:

在Java中,数组是存储在堆中而不是调用堆栈中的对象。因此,这个问题是没有意义的——所有数组都在堆上,因此vla不存在。

这是一个GCC扩展——大多数其他c++编译器不允许。

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

在c++中,要使用一个数组(类对象),其大小直到运行时才能知道,使用std::vectornew[]/delete[]