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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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:\
"
;
    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中的实际动态数组。

To select this standard in GCC, use the option -std=c++11; to obtain all the diagnostics required by the standard, you should also specify -pedantic (or -pedantic-errors if you want them to be errors rather than warnings).


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

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

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

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


小心!未定义的整数根本不保证是任何值。一些编译器将默认为0,而另一些编译器将使用内存中已存在的任何垃圾位。因此,Visual Studio甚至不让我编译。在设置size变量之前,逐步浏览代码以查看分配给分数的内存。

编译时可能的大小是垃圾内存中的随机整数,这意味着它可以在每次执行时更改!

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