繁体   English   中英

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

[英]C++: Why does int array[size] work?

我已经开始学习c ++。 我读到,只能在运行之前设置数组的大小,并且可以在运行时设置动态数组。 所以我原以为这会失败,但是并没有:

#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 ++编译器的新功能吗? 是否意识到我需要一个动态数组并创建它?

可能您使用的是GCC编译器,它的扩展名为可变长度数组

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

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

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

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

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

需要考虑的另一个重要点是,该标准不能保证ARB的内存将在堆栈上分配,并且允许实现调用全局分配函数,尽管其目的是使编译器从中获取并提供空间。堆。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM