动态初始化的数组大小示例
Posted
技术标签:
【中文标题】动态初始化的数组大小示例【英文标题】:array size initialized dynamically example 【发布时间】:2017-09-01 21:21:21 【问题描述】:我很难理解为什么
int n;
cin>>n;
int arr[n];
有效。有人告诉我这段代码不应该运行,因为“n”的值只能在运行时声明,因此不应该编译。我还被告知我的“n”变量应该是常数。当有一个“cin>>”时,你如何使它保持不变(我无法理解如何适应一个常数)。我知道代码很简单,但由于我被告知的内容,我很矛盾。
【问题讨论】:
VLA 不符合 c++ 标准!你真正需要的是std::vector<int> arr(n);
。
【参考方案1】:
根据 C++ 标准 ([dcl.array])
在声明 T D 中,其中 D 具有以下形式
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.
【讨论】:
【参考方案2】:人们不再使用数组,而是使用向量或列表,您不必担心它们的大小,并且有许多有用的函数可用于处理其中的数据。
【讨论】:
以上是关于动态初始化的数组大小示例的主要内容,如果未能解决你的问题,请参考以下文章