假设我有这个:
int x;
int x = (State Determined By Program);
const char * pArray[(const int)x]; // ??
在使用pArray之前,我该如何初始化它?因为数组的初始大小是由用户输入确定的。
谢谢!
假设我有这个:
int x;
int x = (State Determined By Program);
const char * pArray[(const int)x]; // ??
在使用pArray之前,我该如何初始化它?因为数组的初始大小是由用户输入确定的。
谢谢!
如果您在运行时确定数组大小,则无法在编译时初始化数组。
但是,根据您的需求,对于常量数据的非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;
}
#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
}
动态创建的数组大小必须在编译时确定。
您可以使用 new
:
const char* pArray = new char[x];
...
delete[] pArray;
或者更好地使用std::vector
代替(无需手动进行内存管理):
vector<char> pArray;
...
pArray.resize(x);
你提供的示例尝试在堆栈上构建数组。
const char pArray[x];
然而,您无法在堆栈上动态创建对象。这些类型的项目必须在编译时知道。如果这是基于用户输入的变量,则必须使用new关键字在堆内存中创建数组。
const char* pArray = new char[x];
然而,并不是所有的项目都需要在堆上创建。堆分配通常比栈分配慢得多。如果您想将数组保留在堆栈上,您可以始终使用基于块的初始化。
#define MAX_ITEMS 100
const char pArray[MAX_ITEMS]
需要注意的是,第二个选项是浪费的。因为您无法动态调整此数组的大小,所以必须分配足够大的块来容纳程序可能创建的最大数量的项目。
最后,您始终可以使用C++提供的数据结构。std::vector就是这样一个类。它为您提供了很好的抽象级别,并且项目存储在连续内存中,就像数组一样。正如其他答案中指出的那样,一旦您知道向量的最终大小,应该使用resize选项。
std::vector<char> pArray;
pArray.resize(X);
std::vector
呢? - cf-