数组大小动态示例初始化
array size initialized dynamically example
我很难理解为什么
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[]
手动删除它),并且簿记(指针分配的大小是指针的大小)责任。程序员现在也可能必须解决三个和五的规则。
人们不再使用数组,使用向量或列表,您不必担心它们对它们进行尺寸,并且有许多有用的功能可用于处理它们中的数据。
相关文章:
- 内联映射初始化的动态atexit析构函数崩溃
- 动态初始化 C 与 C++ 中的静态值
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- 静态和动态模板初始化可以交错吗?
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- C++ - 使用类中的初始值设定项列表初始化动态集
- 异常 尝试初始化动态数组时未处理
- 如何使用initializer_ist在构造函数中初始化动态数组
- 如何在类中初始化动态数组
- 如何使用一些参数初始化动态分配的数组中的对象
- 初始化动态分配的数组时出错
- 使用对象的复制构造函数初始化动态数组对象
- 初始化动态数组
- 通过已存在的对象初始化动态分配的对象
- c++初始化动态内存中c样式字符串的默认值
- 如何在c++中以非标准方式初始化动态内存
- 初始化动态字符串数组(c++)
- 如何使用memset初始化动态二维数组
- 初始化动态向量列表
- 特征:逗号初始化动态矩阵