- 此问题在此处已有答案**:
Why aren't variable-length arrays part of the C++ standard?(10个答案)
3天前关闭。
我已经使用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++如何编程》第261页也在《常见编程错误4.5:
只能使用常量声明自动数组和静态数组的大小。
启发我。
8条答案
按热度按时间lyr7nygr1#
这在C99中有效。
C99标准支持堆栈上的可变大小数组。可能您的编译器也选择支持这种结构。
注意,这与
malloc
和new
不同。gcc
在堆栈上分配数组,就像int array[100]
一样,只需要调整堆栈指针。没有进行堆分配。这与_alloca
非常相似。gpfsuwkq2#
这被称为VLA(可变长度数组),它是c99中的标准,但是gcc允许它在c++代码中作为扩展,如果你想让它拒绝代码,尝试使用
-std=standard
,-ansi
和-pedantic
选项。pb3s4cty3#
它只在C99中是valid。下次您可以尝试在reliable compiler中检查代码。
0md85ypi4#
它是有效的C99,它不是有效的C++。这是这两种语言之间不少的区别之一。
uwopmtnx5#
此代码在GNU GCC编译器中运行。
7jmck4yq6#
如果你使用的是Dev-Cpp编译器,你可以动态地给数组给予大小,我试过了,没有错误,但是在visual c和visual studio编译器上,这是不可能的。我认为原因是dev-c给未初始化的int赋一个正数,当我们给它一个数字时,它会被给定的数字替换。但是也许其他编译器给未初始化的变量赋null。
h4cxqtbf7#
我最近遇到了一个需要堆栈分配数组的场景(它是v8的一个 Package 器,在每个方法调用上都需要一个args数组)。
一个std::vector将执行堆内存分配,其性能是不可接受的。
下面是我的解决方案,使用模板来分配数组的情况下:
(And当然,我可以使用大小为32的数组,但这不是很优雅。)
mbjcgjjk8#
可变长度数组(Variable Length Arrays,VLA)在C++14标准中得到支持,该标准最近被接受,正在等待发布。