我已经开始学习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 ++编译器中的新功能吗?它是否意识到我需要一个动态数组并改为创建它?
答案 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 ++中标准的动态容器,它使用了一个数组。