数组大小动态初始化示例
array size initialized dynamically example
我无法理解为什么
int n;
cin>>n;
int arr[n];
有效。有人告诉我这段代码不应该 运行 因为 'n' 的值只能在 运行 期间声明,因此不应该编译。我还被告知我的 'n' 变量应该是常量。当有 'cin>>' 时如何使它保持常量(我无法理解如何适应常量)。我知道代码相当简单,但由于有人告诉我,我很矛盾。
根据 C++ 标准 ([dcl.array])
In a declaration T D where D has the form
D1 [ constant-expressionopt ] attribute-specifier-seqopt
数组的大小必须是常量(或未使用适当的初始值设定项指定)。
然而,一些编译器开发人员选择允许可变长度数组 (VLA),无论是为了程序员的方便,还是为了保持在 C++ 中编译 C 代码的能力(自 C99 标准以来,C 就允许使用 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.
人们不再使用数组,使用向量或列表,您不必担心它们的大小,并且有大量有用的函数可用于处理其中的数据。
我无法理解为什么
int n;
cin>>n;
int arr[n];
有效。有人告诉我这段代码不应该 运行 因为 'n' 的值只能在 运行 期间声明,因此不应该编译。我还被告知我的 'n' 变量应该是常量。当有 'cin>>' 时如何使它保持常量(我无法理解如何适应常量)。我知道代码相当简单,但由于有人告诉我,我很矛盾。
根据 C++ 标准 ([dcl.array])
In a declaration T D where D has the form
D1 [ constant-expressionopt ] attribute-specifier-seqopt
数组的大小必须是常量(或未使用适当的初始值设定项指定)。
然而,一些编译器开发人员选择允许可变长度数组 (VLA),无论是为了程序员的方便,还是为了保持在 C++ 中编译 C 代码的能力(自 C99 标准以来,C 就允许使用 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.
人们不再使用数组,使用向量或列表,您不必担心它们的大小,并且有大量有用的函数可用于处理其中的数据。