Как инициализировать массив, размер которого изначально неизвестен?

Скажем, у меня есть это:

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

Как мне инициализировать pArray перед его использованием? Поскольку начальный размер массива определяется пользовательским вводом

Спасибо!


person moonbeamer2234    schedule 16.03.2014    source источник
comment
Согласно этому ответу на аналогичный вопрос, вы не можете делать то, что пытаетесь сделать. Почему бы не использовать std::vector вместо этого?   -  person cf stands with Monica    schedule 16.03.2014
comment
Вы можете использовать вектор или динамический массив, хотя вектор предпочтительнее. См. этот ответ stackoverflow.com/a/1598409/1866301   -  person vaibhav kumar    schedule 16.03.2014


Ответы (3)


Вы не можете инициализировать массив во время компиляции, если вы определяете размер во время выполнения.

Но в зависимости от того, что вы пытаетесь сделать, неконстантный указатель на константные данные может дать вам то, к чему вы стремитесь.

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
}
person Catskul    schedule 16.03.2014

Размер динамически создаваемого массива в стеке должен быть известен во время компиляции.

Вы можете использовать либо new:

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

или лучше вместо этого использовать std::vector (нет необходимости вручную управлять памятью):

vector<char> pArray;
...
pArray.resize(x);
person herohuyongtao    schedule 16.03.2014
comment
herohuyongtao, вы имеете в виду размер динамически создаваемого массива в стеке HEAP? Я не владею С++, поэтому могу ошибаться. - person manolius; 24.07.2019

Приведенный вами пример пытается построить массив в стеке.

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

Причина этого в том, что каждый раз, когда вы добавляете элемент в вектор, если у него больше нет места для роста, он должен перемещать все элементы, чтобы они могли существовать рядом друг с другом. Использование метода изменения размера помогает предотвратить увеличение вектора при добавлении элементов.

person Freddy    schedule 16.03.2014