数组大小在运行时没有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下编译。

如何在没有newmalloc情况下在运行时确定大小?

只是为了仔细检查,我GOOGLE了一些和所有类似的代码我的声称给存储大小的错误。

即使Deitel的C ++如何编程p。 Common Programming Error 4.5下的261个状态:

只有常量可以用来声明自动和静态数组的大小。

启发我。

这在C99中是有效的。

C99标准支持堆栈中可变大小的数组。 也许你的编译器也select了支持这个构造。

请注意,这与mallocnew不同。 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标准中被支持,并且正在等待出版。