c ++ array – выражение должно иметь постоянное значение

Я получаю сообщение об ошибке, когда пытаюсь создать массив из объявленных переменных.

int row = 8; int col= 8; int [row][col]; 

Почему я получаю эту ошибку:

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

При создании такого массива его размер должен быть постоянным. Если вам нужен массив с динамическим размером, вам нужно выделить память для него в куче, и вам также понадобится освободить его с delete когда вы закончите:

 //allocate the array int** arr = new int*[row]; for(int i = 0; i < row; i++) arr[i] = new int[col]; // use the array //deallocate the array for(int i = 0; i < row; i++) delete[] arr[i]; delete[] arr; 

Если вы хотите фиксированный размер, то они должны быть объявлены как const:

 const int row = 8; const int col = 8; int arr[row][col]; 

Также,

 int [row][col]; 

даже не предоставляет имя переменной.

C ++ не допускает постоянные значения для размера массива. Так оно и было.

C99 позволяет размеру массива быть переменной, но я не уверен, что это разрешено для двух измерений. Некоторые компиляторы C ++ (gcc) разрешают это как расширение, но вам может потребоваться включить параметр компилятора, чтобы разрешить его.

И я почти пропустил это – вам нужно объявить имя переменной, а не только размеры массива.

Стандарт требует, чтобы длина массива была значением, которое можно вычислить во время компиляции, чтобы компилятор мог выделить достаточно места в стеке. В вашем случае вы пытаетесь установить длину массива на значение, которое неизвестно во время компиляции. Да, я знаю, что кажется очевидным, что он должен быть известен компилятору, но здесь это не так. Компилятор не может делать никаких предположений о содержимом непостоянных переменных. Итак, идите с:

 const int row = 8; const int col= 8; int a[row][col]; 

UPD: некоторые компиляторы действительно позволят вам снять это. IIRC, g ++ имеет эту функцию. Однако никогда не используйте его, потому что ваш код станет не переносимым для компиляторов.

Вы можете использовать #define в качестве альтернативного решения, которое не вводит vector и malloc, и вы все равно используете один и тот же синтаксис при определении массива.

 #define row 8 #define col 8 int main() { int array_name[row][col]; } 

Когда вы объявляете переменную как здесь

 int a[10][10]; 

вы сообщаете компилятору C ++, что во время выполнения вы хотите, чтобы в памяти программы было записано 100 последовательных целых чисел. Затем компилятор предоставит вашей программе доступ к такой большой памяти, и все будет хорошо с миром.

Если, однако, вы скажете компилятору

 int x = 9001; int y = 5; int a[x][y]; 

компилятор не знает, сколько памяти вам понадобится во время выполнения, не делая много очень сложного анализа, чтобы отслеживать каждое последнее место, где значения x и y изменены [если есть]. Вместо поддержки таких массивов с переменным размером, C ++ и C настоятельно рекомендуют, если вы не хотите, чтобы вы использовали malloc (), чтобы вручную выделить нужное пространство.

TL; DR

 int x = 5; int y = 5; int **a = malloc(x*sizeof(int*)); for(int i = 0; i < y; i++) { a[i] = malloc(sizeof(int*)*y); } 

a теперь представляет собой двумерный массив размером 5x5 и будет вести себя так же, как int a [5] [5]. Поскольку вы вручную выделили память, C ++ и C требуют, чтобы вы удалили ее вручную ...

 for(int i = 0; i < x; i++) { free(a[i]); // delete the 2nd dimension array } free(a); // delete a itself 

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

 int row = 8; int col= 8; int x[row][col]; 

В Xcode, который будет компилироваться и запускаться без каких-либо проблем, в компиляторе M $ C ++ в .NET он не будет компилироваться, он будет жаловаться на то, что вы не сможете использовать литерал non const для инициализации массива, размер должен быть известен во время компиляции

  • Spark 2.0.x выгружает csv-файл из фрейма данных, содержащего один массив строки типа
  • Как скопировать часть массива в другой массив в C #?
  • Как обновить несколько элементов массива в mongodb
  • Странный символ после массива символов
  • Получить объект JavaScript из массива объектов по значению свойства
  • C, почему это объявление большого массива создает ошибку сегментации?
  • Как GCC реализует массивы переменной длины?
  • Преобразование массива объектов в массив их примитивных типов
  • Присвоение массиву char значения в C
  • Создание массива из текстового файла в Bash
  • Получить JSONArray без имени массива?
  • Interesting Posts

    Почему такие вещи, как терминал Gnome, называются терминальными эмуляторами вместо «терминалов»?

    Как обрезать пробел из строки?

    Используйте Windows Live ID, но введите логин с другим паролем

    Bootstrap – Как удалить желоб между столбцами

    Рисование объекта с использованием getGraphics () без расширения JFrame

    Компьютер не загружается, показывает ошибку PXE и ​​/ или «операционная система не найдена», «нет загрузочного устройства», «вставить загрузочный носитель» или другую аналогичную ошибку

    Больше не удается найти приложения в Windows 10

    Преобразовать float в строку с заданной точностью и количеством десятичных цифр?

    Как использовать регулярные выражения, как эффективно сопоставлять строки между двойными кавычками со встроенными двойными кавычками?

    Как анализировать XML с помощью анализатора SAX

    Как заставить git не запрашивать парольную фразу для ssh-ключа на окнах?

    Проблема с наведением IPad / iPhone заставляет пользователя дважды щелкнуть ссылку

    Как получить срез в виде массива в Rust?

    Как изменить автора фиксации для одного конкретного коммита?

    Как установить обновления и завершить работу из командной строки?

    Давайте будем гением компьютера.