声明一个基于函数参数的局部数组在c++中是合法的
Is declaring a local array based on function arguments legal in 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;
}
}
这些被称为可变长度数组。它们在c++中是不允许的。但是有些编译器(比如GCC)将它们作为扩展来支持。
C99允许使用可变长度数组
编辑:为你的新问题。这个问题的最佳答案解释了为什么c++没有可变长度数组。
为什么堆栈中没有可变大小的数组?
编辑2:
在Java中,数组是存储在堆中而不是调用堆栈中的对象。因此,这个问题是没有意义的——所有数组都在堆上,因此vla不存在。
这是一个GCC扩展——大多数其他c++编译器不允许。
正如其他人所提到的,这些在C99中被称为可变长度数组,但在c++中它们是不允许的,除非通过GCC扩展,如果你希望你的代码可移植,你不应该使用它。
在c++中,要使用一个数组(类对象),其大小直到运行时才能知道,使用std::vector
或new[]
/delete[]
。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 结构数组 - 未引用的局部变量
- 为什么 g++ 不优化局部数组而是优化全局数组?
- 方法用于最快的分配,并且不需要将动态大小的数组对象作为局部变量
- C++在二维数组中寻找局部最大值
- 为什么局部变量不隐藏数组定义中的全局变量
- 局部数组长度与从函数调用时不同
- 在 CUDA 中实现等效的可变长度(局部)数组
- 复制局部变量中的char*数组
- 局部数组在循环中重复!c++
- 为什么函数中的局部数组不能接受一个不稳定的参数?在c++中
- 对局部数组中的元素进行计数
- 使用非常量变量声明局部数组来设置长度,这很有效
- 声明一个基于函数参数的局部数组在c++中是合法的
- 局部数组变量 exc 糟糕的访问分段 & 局部还是全局?
- 将.txt文件中的字符串输出到成员方法局部作用域之外的动态数组
- 如何在c++中返回局部数组
- 是为堆栈局部数组创建的指针变量
- 使用 'new int[n]' 声明新数组时,为什么它没有出现在局部变量列表中?