2015-04-11 4 views
-4

У меня есть требование, когда мне нужно будет вводить данные от пользователя и основываться на входной длине массива. Напр.Как объявить динамический массив двумерных целых чисел в C++

int row, column;  
cin>> row>>column;  
int matrix[row][column];  

Однако int matrix[row][column] не работает, как компилятор дает ошибку говоря

"Expression must have a constant value" 

Кроме того, если кто-то может вести меня о том, как адрес matrix[row][column] присваивается указателю. Я знаю, как это сделать со статическим массивом, но не с динамическим.

+0

Использование 'станд :: вектор матрицы <станд :: вектор >; и' станд :: вектор :: размер() '. –

+0

http://www.boost.org/doc/libs/1_42_0/libs/numeric/ublas/doc/matrix.htm или сворачивать свои собственные. –

ответ

0

Объявить 2d динамического массива вам нужны указатели указателей

int row, column;  
cin>> row>>column;  
int** matrix = new int*[row]; 
for(int i = 0; i < row; ++i) 
    matrix[i] = new int[column]; 

Это происходит потому, что массивы являются статическими в C++ и занять фиксированное место в memory.lets говорит, что массив имеет 1000 элементов. когда вы объявляете статический массив, это означает, что в памяти записано 1000 позиций друг за другом, зарезервированных для вашего массива. Если вы хотите добавить еще один элемент в массив, вы добавите этот элемент в конец зарезервированного массива, но если эта позиция содержит некоторые данные для чего-то другого, кроме массива, эти данные будут удалены!

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

+0

Спасибо Yazan за ваш ответ, это действительно помогает. Я пытался что-то вроде ниже, и во время компиляции моя программа разбилась. Пожалуйста, помогите мне понять. – Aniruddha

+0

int mat [2] [3] = {{9,10}, {11,12}, {13,14}}; \t int ** ptr = {NULL}; \t \t ptr [0] = мат [3]; // Ошибка программы здесь, пожалуйста, сообщите, что пошло не так – Aniruddha

+0

'int mat [3] [2] = {{9,10}, {11,12}, {13,14}};' 'int ** ptr = new int * [3]; ' ' ptr [0] = мат [0]; ' ' ptr [1] = мат [1]; ' ' ptr [2] = мат [2]; ' Это правильное объявление массива (вы смешали 2 и 3 неверных), и вы должны объявить указатель как массив указателей –

0

Использование 2D-массива для хранения матрицы - плохая идея - особенно из-за цикла для выделения памяти. Используйте 1D массив строк размера * столбцы и элементы доступа с y * столбцами + x и сохраните его внутри и unique_ptr, чтобы избежать проблем управления памятью Commons.

Вот что я предлагаю:

uint32_t rows, cols; 
std::cin >> rows >> cols; // Check rows and cols are actually numbers 
std::unique_ptr<int[]> matrix(new int[rows*cols]); 
+0

Просто используйте' std :: vector' как хранилище. [KISS - Keep It Simple, Stupid] (http://en.wikipedia.org/wiki/KISS_principle). :) –

+0

Вам не нужно зацикливать выделение памяти, если вы хотите сделать работу, чтобы сделать только одно распределение памяти, чтобы содержать как массив указателей, так и данные. Заполнение частей одного блока памяти правильными значениями адреса, чтобы они работали как массивы указателей, может занимать довольно много строк кода. Это стоит того, однако, если вы используете многопоточное приложение, которое должно динамически выделять и освобождать много 2 или более массивов измерений. Если ваше приложение не делает этого, это не стоит. –

Смежные вопросы