我无法理解为什么数组大小初始化动态例如
int n;
cin>>n;
int arr[n];
作品。我被告知该代码不应该运行,因为'n'的值只能在运行时声明,因此不应该编译。我也被告知我的'n'变量应该是不变的。当有'cin >>'的时候,你如何使它保持不变?'(我无法理解如何适应常量)。我知道代码很简单,但是由于我被告知的内容,我会产生冲突。
我无法理解为什么数组大小初始化动态例如
int n;
cin>>n;
int arr[n];
作品。我被告知该代码不应该运行,因为'n'的值只能在运行时声明,因此不应该编译。我也被告知我的'n'变量应该是不变的。当有'cin >>'的时候,你如何使它保持不变?'(我无法理解如何适应常量)。我知道代码很简单,但是由于我被告知的内容,我会产生冲突。
根据C++标准([dcl.array])
在声明TD其中d具有形式
D1 [常数表达式选择] 属性说明符-seq 选择
的AR大小射线必须是恒定的(或者没有用适当的初始化器指定)。
然而,一些编译器开发人员为了程序员的方便选择允许使用可变长度数组(VLA),以保持C++编译C代码的能力(C自C99标准以来允许VLA)或一些恶意目的我们可能只有在征服了世界之后才会学习。
当编译时无法知道分配的大小时,符合最佳标准的解决方案是use a std::vector
。
int n;
if (cin>>n) // don't allocate unless n is valid
{
vector<int> arr(n);
// use arr
}
即使VLA可用,vector
仍然是一个更安全的解决方案。 vector
是从动态存储分配的,通常是比自动存储更大的数据存储区,如果分配失败,则引发异常。对于存储来说太大的可变长度数组的行为通常是未定义的,并且可能会溢出堆栈(自动存储的常见形式),导致神秘错误增加。
应该避免使用new
分配原始内存,因为它需要额外的管理(它必须在某个时间点用delete[]
手动删除)和簿记(指针的分配大小未知)。程序员现在也可能需要地址The Rules of Three and Five.
人们不再使用数组了,使用向量或列表,您不必担心调整它们的大小,并且有可用于处理数据的有用函数的负载他们。
VLA不符合C++标准!你真正需要的是'std :: vector arr(n);'。 –
user0042