如何初始化一个大小最初未知的数组?

15

假设我有这个:

int x;
int x = (State Determined By Program);
const char * pArray[(const int)x]; // ??

在使用pArray之前,我该如何初始化它?因为数组的初始大小是由用户输入确定的。

谢谢!


4
根据类似问题的这个答案,你无法实现你想要做的事情。为什么不使用std::vector呢? - cf-
你可以使用向量或动态数组,但向量更受欢迎。请参考此响应https://dev59.com/BnI-5IYBdhLWcg3w9tdw#1598409 - vaibhav kumar
3个回答

10

如果您在运行时确定数组大小,则无法在编译时初始化数组。

但是,根据您的需求,对于常量数据的非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
}

10

动态创建的数组大小必须在编译时确定。

您可以使用 new

const char* pArray = new char[x];
...
delete[] pArray;

或者更好地使用std::vector代替(无需手动进行内存管理):

vector<char> pArray;
...
pArray.resize(x);

herohuyongtao,你是指“在栈上动态创建数组的大小”吗?我不太擅长C++,所以可能会有错误。 - manolius

0

你提供的示例尝试在堆栈上构建数组。

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);

这是因为每次向向量中添加元素时,如果它没有足够的空间进行扩展,就必须重新定位所有项目,以便它们可以相邻存在。使用resize方法有助于防止在添加项目时向量不得不增长。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接