Скажи, что у меня есть это:
int x;
int x = (State Determined By Program);
const char * pArray[(const int)x]; // ??
Как бы я инициализировал pArray перед его использованием?
Потому что начальный размер массива определяется пользовательским вводом
Спасибо!
Вы не можете инициализировать массив во время компиляции, если вы определяете размер во время выполнения.
Но в зависимости от того, что вы пытаетесь сделать, неконстантный указатель на константные данные может дать вам то, что вы собираетесь.
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, вероятно, больше, чем вы ищете. Если вы хотите, чтобы он вел себя больше как ваш константный массив, вы можете присвоить его константной ссылке.
#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
}
Размер динамически создаваемого массива в стеке должен быть известен во время компиляции.
Вы можете использовать new
:
const char* pArray = new char[x];
...
delete[] pArray;
или лучше использовать std::vector
вместо этого (нет необходимости выполнять управление памятью вручную):
vector<char> pArray;
...
pArray.resize(x);
Приведенный вами пример пытается построить массив в стеке.
const char pArray[x];
Однако вы не можете динамически создавать объекты в стеке. Эти типы элементов должны быть известны во время компиляции. Если это переменная, основанная на пользовательском вводе, вы должны создать массив в динамической памяти с помощью новый ключевое слово.
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);
Причина этого заключается в том, что каждый раз, когда вы добавляете элемент в вектор, если у него больше нет места для роста, он должен перемещать все элементы, чтобы они могли существовать рядом друг с другом. Использование метода изменения размера помогает предотвратить рост вектора при добавлении элементов.