powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Выделение памяти под многомерный массив с помощью new
6 сообщений из 6, страница 1 из 1
Выделение памяти под многомерный массив с помощью new
    #32495587
LVU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LVU
Гость
Пусть переменная t объявлена как
Код: plaintext
int (**t)[ 24 ];

Вроде бы, это - объявление указателя на указатель на массив. Теперь я хочу выделить память под внешний указатель как на массив размера n.
Это можно было бы сделать так:
Код: plaintext
t=(int (**)[ 24 ])malloc(n*sizeof(int (**)[ 24 ]));

, но все-таки хочется через new, а не malloc.
И вот записать выражение для new, чтобы не использовать приведение типов (т.е, чтобы new сам вернул int (**)[24]) я не могу :( Подскажите, как это сделать?

P.S. Я уже нашел решение с использованием typedef:
Код: plaintext
1.
2.
3.
typedef int (* ptr_24_int)[ 24 ];
ptr_24_int *t;
t=new ptr_24_int[n];

, теперь мне просто интересно, позволяет ли в принципе
грамматика C++ сделать такую вещь напрямую?
...
Рейтинг: 0 / 0
Выделение памяти под многомерный массив с помощью new
    #32495606
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
int (*arr)[ 10 ][ 24 ] = new int[ 3 ][ 10 ][ 24 ];
...
Рейтинг: 0 / 0
Выделение памяти под многомерный массив с помощью new
    #32495613
LVU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LVU
Гость
Ну, если я не объявил второй размер массива константным, значит я его не знаю заранее, да? А в конструкции
Код: plaintext
new int[n1][n2]...[nk]

все индексы, кроме первого, обязаны быть константыми выражениями.
...
Рейтинг: 0 / 0
Выделение памяти под многомерный массив с помощью new
    #32495633
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты спросил, я ответил.

Теперь твое творение:

Код: plaintext
1.
2.
typedef int (* ptr_24_int)[ 24 ];
ptr_24_int *t;
t=new ptr_24_int[n];


Попробуем обратится к новоиспеченному массиву: t[0][0][0] = 0. Так, что наблюдаем? Правильно, ошибка защиты или тому подобное.

Что остается:
1) либо использовать линейную развертку массива вычисляя самостоятельно индекс элемента
int* arr3d = new int[3*10*24];
arr3d[i*10*24 +j*24 + k] = 0;

2) либо создать корректный многомерный массив по всем правилам:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
size_t n =  3 ;
size_t k =  10 ;
size_t l =  24 ;

int***arr3d = new int**[n];
for(size_t i =  0 ; i < n; i++)
{
   arr3d[i] = new int*[k];
   for(size_t j =  0 ; j < k; j++)
       arr3d[i][j] = new int[l];
}


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

Лады, удач, да:)
...
Рейтинг: 0 / 0
Выделение памяти под многомерный массив с помощью new
    #32495640
LVU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LVU
Гость
Дело в том, что я недописал код, поскольку вопрос изначально был задан про выделение памяти под внешний указатель. На самом деле, конечно, должно быть так:
Код: plaintext
1.
2.
3.
4.
5.
typedef int (* ptr_24_int)[ 24 ];
ptr_24_int *t;
t=new ptr_24_int[n];
for (int i= 0 ; i<n; i++)
   t[i]=new int [m][ 24 ];
...
Рейтинг: 0 / 0
Выделение памяти под многомерный массив с помощью new
    #32495701
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторззы: второй способ предпочтителен
Извини, конечно, не второй способ предпочтительней использовать, а линейную развертку многомерного массива, но здесь надо смотреть именно на задачу, может от второго способа и не уйти.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Выделение памяти под многомерный массив с помощью new
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]