数组大小动态示例初始化

array size initialized dynamically example

本文关键字:初始化 动态 数组      更新时间:2023-10-16

我很难理解为什么

int n;
cin>>n;
int arr[n];

有效。有人告诉我,该代码不应该运行,因为" n"的值只能在运行时声明,因此不应编译。我还被告知我的" n"变量应该是恒定的。当有一个" cin>>"时,您如何使其保持恒定(我很难理解如何在常数中适应)。我知道代码很简单,但是由于被告知,我矛盾了。

根据C 标准([DCL.Array])

在声明t d中,d具有形式

d1 [常数-Expression opt ] attribute-specifier-seq opt

数组的大小必须是恒定的(或不用适当的初始器指定)。

但是,一些编译器开发人员已选择允许可变长度阵列(VLA),无论是为了使程序员提供方便,以维持在C 中编译C代码的能力(C自C99标准以来允许VLA),或者我们的某些邪恶目的是我们只有在征服世界之后才能学习。

最好的标准解决方案是在编译时无法知道分配的大小时使用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[]手动删除它),并且簿记(指针分配的大小是指针的大小)责任。程序员现在也可能必须解决三个和五的规则。

人们不再使用数组,使用向量或列表,您不必担心它们对它们进行尺寸,并且有许多有用的功能可用于处理它们中的数据。