数组大小在运行时没有dynamic分配是允许的?
我已经使用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
情况下在运行时确定大小?
只是为了仔细检查,我GOOGLE了一些和所有类似的代码我的声称给存储大小的错误。
即使Deitel的C ++如何编程p。 Common Programming Error 4.5下的261个状态:
只有常量可以用来声明自动和静态数组的大小。
启发我。
这在C99中是有效的。
C99标准支持堆栈中可变大小的数组。 也许你的编译器也select了支持这个构造。
请注意,这与malloc
和new
不同。 gcc
通过调整堆栈指针就像在int array[100]
那样分配堆栈上的int array[100]
。 没有堆分配完成。 这几乎就像_alloca
。
这就是所谓的VLAs(可变长度数组)。 它在c99中是标准的,但是gcc允许它在c ++代码中作为扩展。 如果你想要拒绝这个代码,试试用-std=standard
, -ansi
和-pedantic
选项。
它只在C99 有效 。 下次你可以尝试在可靠的编译器中检查你的代码。
它是有效的C99,它是无效的C ++。 这是两种语言之间的不less差异之一。
如果你正在使用Dev-Cpp编译器,你可以dynamic地将大小赋给一个数组。我已经尝试过了,并且没有任何错误,但是在visual c ++和visual studio编译器中这是不可能的。 我认为原因是dev-c ++给未初始化的int分配一个正数,当我们给它一个数字时,它被给定的数字replace。 但也许其他编译器给未初始化的variables空值。
此代码在GNU GCC编译器中运行。
#include<bits/stdc++.h> int main(int argc, char **argv) { size_t size; std:: cin >> size; int array[size]; for(size_t i = 0; i < size; i++) { array[i] = i; std:: cout << i; } return 0; }
可变长度数组(VLA)在最近被接受的C ++ 14标准中被支持,并且正在等待出版。