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与模板一起使用(因为模板的代码生成取决于类型,其中包括大小,而大小在编译时是未知的)。
同样,还有其他限制,
要考虑的另一个重要点是,该标准不能保证ARB的内存将在堆栈上分配,并且允许实现调用全局分配函数,尽管其目的是使编译器赶上并提供编译器。堆栈中的空间。
小心!未定义的整数根本不保证是任何值。一些编译器将默认为0,而另一些编译器将使用内存中已存在的任何垃圾位。因此,Visual Studio甚至不让我编译。在设置size变量之前,逐步浏览代码以查看分配给分数的内存。
编译时可能的大小是垃圾内存中的随机整数,这意味着它可以在每次执行时更改!
C样式数组需要知道要分配多少连续内存。这允许直接索引和其他优化。正如其他人所建议的那样,std :: vector是C中的标准动态容器,它在幕后使用数组。