我无法理解为什么
int n;
cin>>n;
int arr[n];
的工作原理。我被告知这个代码不应该运行,因为'n'的值只能在运行时声明,因此不应该编译。我还被告知我的'n'变量应该是不变的。如果有'cin>>',你如何使它保持不变? (我很难理解如何适应常数)。我知道代码相当简单,但我因为被告知而感到矛盾。
答案 0 :(得分:0)
根据C ++标准([dcl.array])
在声明T D中,D的格式为
D1 [常量表达式 opt ] attribute-specifier-seq opt
数组的大小必须是常量(或未使用适当的初始化程序指定)。
然而,一些编译器开发人员选择允许可变长度数组(VLA)以方便程序员,保持在C ++中编译C代码的能力(C允许自C95标准以来的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.
答案 1 :(得分:0)
人们不再使用数组,使用向量或列表,您不必担心调整它们的大小,并且有大量有用的函数可用于处理数据。