可以在运行时确定数组的大小吗?

时间:2014-10-01 06:47:15

标签: c++ arrays

代码compiles and runs,但是合法吗? AFAIK,静态数组的大小必须在编译时知道。

#include <iostream>
void foo(const unsigned size){
    double arr[size];
    for(auto& i:arr){
        i=2;
        std::cout << i;
    }
}

int main(){
    unsigned size;
    std::cin >> size;
    foo(size);
}

3 个答案:

答案 0 :(得分:3)

严格来说,这不合法。 标准C ++不支持可变长度数组(VLA) 。大多数编译器都支持VLA和扩展,但使用这些扩展可能会给你带来非便携行为。

此外,源代码中没有static数组。为此,您需要在声明中使用static关键字。

答案 1 :(得分:1)

正如用户657267所述,已经在N3639中讨论了C ++ 14的运行时大小数组,并讨论了另一个类似的功能std::dynarray,但它们已被C ++ 14拒绝。

目前,这不被视为标准的一部分,尽管有些编译器将其实现为非可移植扩展,例如gcc就是其中一个编译器(可能因为这在C99中是合法的)。

大多数情况下,你可以使用矢量来达到同样的效果。

答案 2 :(得分:0)

在您的示例中,没有具有静态存储持续时间的数组。函数中有一个具有自动存储持续时间的本地数组。 数组的大小应该是一个常量表达式。

如果你展示的代码是编译的,那么这意味着它是C ++中支持可变长度数组的编译器的一个特性,与C中的相同。