Конвертировать char ** в char [x] [x] - PullRequest
2 голосов
/ 22 марта 2011

В C ++ я хочу, чтобы в моем классе было поле char **, которое будет иметь размер, введенный пользователем.По сути, я хочу сделать что-то вроде этого -

char** map;
map = new char[10][10];

, где 10 - это любое целое число.Я получаю сообщение об ошибке, в котором говорится, что невозможно преобразовать char * [10] в char **.Почему он не может сделать это, когда я мог сделать -

char* astring;
astring = new char[10];

?

Ответы [ 3 ]

6 голосов
/ 22 марта 2011

Поскольку массив не является указателем . Массивы распадаются на указатели на их первые элементы, но это происходит только на первом уровне: двумерный массив превращается в указатель на одномерный массив, но это не так - он не превращается в указатель на указатель .

operator new[] позволяет выделять динамический массив размера, известного только во время выполнения, но он позволяет выделять только одномерные массивы. Если вы хотите выделить динамический двумерный массив, вам нужно сделать это в два этапа: сначала выделить массив указателей, затем для каждого указателя выделить еще один одномерный массив. Например:

char **map = new char*[10];  // allocate dynamic array of 10 char*'s
for(int i = 0; i < 10; i++)
    map[i] = new char[10];  // allocate dynamic array of 10 char's

Затем, чтобы освободить массив, вы должны освободить все в обратном порядке:

for(int i = 0; i < 10; i++)
    delete [] map[i];
delete [] map;
1 голос
/ 22 марта 2011

С другой стороны, что за

map = new char[x][y];

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

Итак, если вы действительно хотите, чтобы ваш код прошел без проблем, правильный путь -

char (* map)[10] ;
map = new char[some_value_you_want][10];

Или, если быть более понятным,

typedef char array10[10];
array10 * map = new array10[some_value_you_want];
0 голосов
/ 22 марта 2011

Многомерные массивы таким способом не поддерживаются. Вам нужно выделить два измерения по отдельности.

char** map = new (char*)[10];

for( int i = 0; i < 10; ++i ) {
  map[i] = new char[10];
}
...