【问题标题】:How to initialize an array whose size is initially unknown?如何初始化一个最初大小未知的数组?
【发布时间】:2014-04-21 09:10:58
【问题描述】:

说我有这个:

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

如何在使用 pArray 之前对其进行初始化? 因为Array的初始大小是由用户输入决定的

谢谢!

【问题讨论】:

标签: c++ arrays initialization lazy-initialization


【解决方案1】:

在编译时必须知道堆栈上动态创建的数组的大小。

您可以使用new:

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

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

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

【讨论】:

  • herohuyongtao,您的意思是“HEAP 堆栈上动态创建的数组的大小”吗?我不精通c++,所以很容易出错。
【解决方案2】:

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

但根据您要执行的操作,指向 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
}

【讨论】:

    【解决方案3】:

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

    const char pArray[x];
    

    但是,您不能在堆栈上动态创建对象。这些类型的项目必须在编译时知道。如果这是基于用户输入的变量,那么您必须使用 new 关键字在堆内存中创建数组。

    const char* pArray = new char[x];
    

    但是,并非所有项目都需要在堆上创建。堆分配通常比堆栈分配慢得多。如果您想将数组保留在堆栈上,您始终可以使用基于块的初始化。

    #define MAX_ITEMS 100
    const char pArray[MAX_ITEMS]
    

    需要注意的是,第二个选项是浪费的。因为你不能动态调整这个数组的大小,所以你必须分配一个足够大的块来容纳你的程序可以创建的最大项目数。

    最后,您始终可以使用 C++ 提供的数据结构。 std::vector 就是这样一个类。它为您提供了良好的抽象级别,并且项目像数组一样存储在临时内存中。正如其他答案之一所述,一旦您知道矢量的最终大小,您应该使用调整大小选项。

    std::vector<char> pArray;
    pArray.resize(X);
    

    这样做的原因是每次向向量添加元素时,如果它不再有足够的空间来增长,它必须重新定位所有项目,以便它们可以彼此相邻存在。使用 resize 方法有助于防止向量在添加项目时增长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      相关资源
      最近更新 更多