数组大小动态初始化示例

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.

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