C ++:为什么int数组[size]有效?

时间:2013-07-30 12:43:49

标签: c++ arrays dynamic automation

我已经开始学习c ++了。我读到数组的大小只能在运行之前设置,而dymanic数组可以在运行时设置。所以我期待这会失败,但事实并非如此:

#include <iostream>

int main() {
    using namespace std;
    int size;
    cout << "enter array size:";
    cin >> size;
    int i, score[size], max; //array size set to variable doesn't fail
    cout << endl << "enter scores:\n";
    cin >> score[0];
    max = score[0];
    for (i = 1; i < size; i++)
    {
        cin >> score[i];
        if (score[i] > max)
    max = score[i];
    }
    cout << "the highest score is " << max << endl;
    return 0;
}

这是最近的C ++编译器中的新功能吗?它是否意识到我需要一个动态数组并改为创建它?

3 个答案:

答案 0 :(得分:4)

您可能正在使用GCC编译器,它有一个名为Arrays of Variable Length的扩展名。

std::vector是C ++中真正的动态数组。

  

要在GCC中选择此标准,请使用选项-std = c ++ 11;要获得标准所需的所有诊断,您还应指定-pedantic(或-pedantic-errors,如果您希望它们是错误而不是警告)。

答案 1 :(得分:2)

在当前和过去的所有标准中,该代码都是格式错误的。可变长度数组是C99功能而不是C ++功能,尽管某些编译器确实将其作为扩展提供。在即将推出的标准(预期为C ++ 14,目前正处于审核过程中)中,采用了其他名称(略有不同的语义)的类似功能,因此期望它在未来成为标准。

请注意,一般情况下,排除运行时绑定数组(因为它们在即将推出的标准中命名),数组的大小是对象静态类型的一部分,并且已知在编译时。在VLA或运行时绑定数组的情况下,大小在编译时是未知的,因此类型在某种程度上是类型中的第二类公民。这意味着您不能将VLA / ARB与模板一起使用(因为模板的代码生成取决于类型,其中包括编译时未知的大小)。

以同样的方式存在其他限制,sizeof不是VLA的编译时操作,甚至不允许ARB,这些形式的数组只能用于具有自动存储持续时间的对象(即在堆栈中),您不能获取数组的地址(尽管您可以获取第一个成员的地址),...

另一个要考虑的重点是标准不保证ARB的内存将在堆栈上分配,并允许实现调用全局分配函数,尽管编译器的意图是赶上并提供堆栈中的空间。

答案 2 :(得分:0)

小心!未定义的整数不保证任何价值。有些编译器将默认为0,而其他编译器将使用内存中已有的任何垃圾位。因此,Visual Studio甚至不会让我编译。在设置size变量之前,单步执行代码以查看分配的内存以获得分数。可能 size 因为它是编译的垃圾内存中的随机整数,这意味着它可以在每次执行时更改!

C样式数组需要知道要分配多少连续内存。这允许直接索引和其他优化。正如其他人所建议的那样, std :: vector 是C ++中标准的动态容器,它使用了一个数组。