2017-09-01 22 views
-2

我无法理解为什么数组大小初始化动态例如

int n; 

cin>>n; 
int arr[n]; 

作品。我被告知该代码不应该运行,因为'n'的值只能在运行时声明,因此不应该编译。我也被告知我的'n'变量应该是不变的。当有'cin >>'的时候,你如何使它保持不变?'(我无法理解如何适应常量)。我知道代码很简单,但是由于我被告知的内容,我会产生冲突。

+8

VLA不符合C++标准!你真正需要的是'std :: vector arr(n);'。 – user0042

回答

0

根据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.

0

人们不再使用数组了,使用向量或列表,您不必担心调整它们的大小,并且有可用于处理数据的有用函数的负载他们。