如何初始化一个初始大小未知的数组
How to initialize an array whose size is initially unknown?
假设我有这个:
int x;
int x = (State Determined By Program);
const char * pArray[(const int)x]; // ??
如何在使用pArray之前初始化它?因为Array的初始大小是由用户输入
决定的谢谢!
在编译时必须知道堆栈上动态创建的数组的大小。
您可以使用new
:
const char* pArray = new char[x];
...
delete[] pArray;
或者使用std::vector
更好(不需要手动进行内存管理):
vector<char> pArray;
...
pArray.resize(x);
如果在运行时确定数组的大小,则不能在编译时初始化数组。
但是根据你想做的事情,一个指向const数据的非const指针可能会为你提供你想要的。
const char * pArray = new const char[determine_size()];
一个更完整的例子:
int determine_size()
{
return 5;
}
const char * const allocate_a( int size )
{
char * data = new char[size];
for( int i=0; i<size; ++i )
data[i] = 'a';
return data;
}
int main()
{
const char * const pArray = allocate_a(determine_size());
//const char * const pArray = new char[determine_size()];
pArray[0] = 'b'; // compile error: read-only variable is not assignable
pArray = 0 ; // compile error: read-only variable is not assignable
delete[] pArray;
return 0;
}
我同意其他人的观点,std::vector可能更符合你的要求。如果你想让它的行为更像你的const数组,你可以把它赋值给一个const引用。
#include <vector>
int main()
{
std::vector<char> data;
data.resize(5);
const std::vector<char> & pArray = data;
pArray[0] = 'b'; // compile error: read-only variable is not assignable
}
您提供的示例尝试在堆栈上构建数组。
const char pArray[x];
但是,不能动态地在堆栈上创建对象。在编译时必须知道这些类型的项。如果这是一个基于用户输入的变量,那么必须在堆内存中使用new关键字创建数组。
const char* pArray = new char[x];
然而,并不是所有的项都需要在堆上创建。堆分配通常比堆栈分配慢得多。如果你想保持你的数组在堆栈上,你总是可以使用基于块的初始化。
#define MAX_ITEMS 100
const char pArray[MAX_ITEMS]
应该注意的是第二个选项是浪费的。因为你不能动态地调整数组的大小,你必须分配一个足够大的块来容纳你的程序可以创建的最大数量的项。
最后,您总是可以使用c++提供的数据结构。vector就是这样一个类。它提供了一个很好的抽象级别,并且项目像数组一样存储在随机存储器中。正如其他答案之一所指出的,一旦你知道vector的最终大小,就应该使用resize选项。
std::vector<char> pArray;
pArray.resize(X);
这样做的原因是每次向vector中添加元素时,如果它不再有足够的空间增长,它必须重新定位所有元素,以便它们可以彼此相邻存在。使用resize方法有助于防止vector在添加项时必须增长。
相关文章:
- C++未知长度字符串的数组,其行为类似于 Python 字符串列表
- C++中数组大小未知的指针转换
- 如何定义在编译时数据未知的 const 数组
- 在C++中初始化第一维大小未知的二维数组
- 在带有模板的函数中传递未知大小的 std::数组.如何更正此代码?
- 你能让数组中的项数未知吗
- 当数组大小在C++中未知时,如何在运行时将对字符串数组的引用作为函数参数传递?
- 如何将输入到具有未知数量元素的数组中?
- 获取由空格分隔的未知大小的单行输入,并将其存储到整数数组中
- 使用 ReadProcessMemory() 将未知大小的字符数组或字符串读入 wstring 中
- 未知容器、向量或数组 c++ 的大小
- 未知大小的数组作为类成员,用于在运行时(对象创建时间)创建数组的对象
- 构造函数初始化器列表中未知长度的数组
- 在 c++ 中使用未知元素初始化的字符数组
- 特征:将数组映射到矩阵大小未知的矩阵
- 如何声明一个未知大小的数组,然后输入直到我想要,然后获取数组的大小
- 如何在 C++ 中将值附加到未知大小的数组中
- 如何确定未知类型数组的索引是否为空
- 使用数组和布尔值在输出未知时从输出中删除逗号
- C++传递指向未知大小的数组的指针,函数大小并填充它