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

How to initialize an array whose size is initially unknown?

本文关键字:未知 数组 一个 初始化      更新时间:2023-10-16

假设我有这个:

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在添加项时必须增长。