web-dev-qa-db-ja.com

サイズが最初は不明な配列を初期化するにはどうすればよいですか?

私がこれを持っていると言う:

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

使用する前にpArrayを初期化するにはどうすればよいですか?配列の初期サイズはユーザー入力によって決定されるため

ありがとう!

4
moonbeamer2234

実行時にサイズを決定する場合、コンパイル時に配列を初期化することはできません。

しかし、何をしようとしているのかによっては、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
}
6
Catskul

スタック上に動的に作成された配列のサイズは、コンパイル時に知る必要があります。

newを使用できます。

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

以上を使用する方が良い std::vector 代わりに(手動でメモリ管理を行う必要はありません):

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

提供した例では、スタック上にアレイを構築しようとしています。

const char pArray[x];

ただし、スタック上にオブジェクトを動的に作成することはできません。これらのタイプのアイテムは、コンパイル時に認識されている必要があります。これがユーザー入力に基づく変数である場合は、newキーワードを使用してヒープメモリに配列を作成する必要があります。

const char* pArray = new char[x];

ただし、すべてのアイテムをヒープ上に作成する必要はありません。ヒープの割り当ては通常、スタックの割り当てよりもはるかに遅くなります。配列をスタックに保持したい場合は、常にブロックベースの初期化を使用できます。

#define MAX_ITEMS 100
const char pArray[MAX_ITEMS]

2番目のオプションは無駄であることに注意してください。この配列のサイズを動的に変更することはできないため、プログラムが作成できるアイテムの最大数を保持するのに十分な大きさのチャンクを割り当てる必要があります。

最後に、C++が提供するデータ構造をいつでも使用できます。 std :: vectorはそのようなクラスです。それはあなたに良いレベルの抽象化を提供し、アイテムは配列のように偶発的なメモリに保存されます。他の回答の1つで述べたように、ベクトルの最終的なサイズがわかったら、サイズ変更オプションを使用する必要があります。

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

これは、ベクトルに要素を追加するたびに、成長するのに十分なスペースがなくなった場合に、すべてのアイテムを再配置して、それらが隣り合って存在できるようにする必要があるためです。サイズ変更方法を使用すると、アイテムを追加するときにベクターが大きくなるのを防ぐことができます。

0
Freddy