Динамически инициализировать многомерный массив в c

#c #dynamic-arrays

#c #динамические массивы

Вопрос:

Как я могу динамически инициализировать ptr с помощью new:

 int values1[4][2] = {{2,3},{-4,0},{3,-7},{2,2}};
int values2[4][2] = {{1,1},{-2,-3},{4,12},{-5,25}};
    
int (*ptr[2])[4][2] = {amp;values1,amp;values2};
  

Я попробовал следующее, но я получаю ошибку:

 int *ptr = new int[2*4*2]{amp;values1,amp;values2}; 
  

Комментарии:

1. Если у вас нет очень веской причины не делать этого, вы должны использовать для этого контейнеры, а не массивы в стиле c: en.cppreference.com/w/cpp/container

2. Я пытаюсь использовать динамический массив…

3. Динамический массив: std::vector

4. Я тоже не могу использовать vector

5. Почему? Вы изучаете C или C ?

Ответ №1:

Typedef может помочь с таким сложным кодом

 int values1[4][2] = { { 2, 3 }, { -4, 0 }, { 3, -7 }, { 2, 2 } };
int values2[4][2] = { { 1, 1 }, { -2, -3 }, { 4, 12 }, { -5, 25 } };

typedef int(*xxx)[2];

int main()
{
    xxx* ptr = new xxx[2];
    ptr[0] = values1;
    ptr[1] = values2;
    return 0;
}
  

Я, честно говоря, понятия не имею, как бы вы написали это без xxx typedef

Редактировать

Похоже, это правильная версия без typedef

 int(**ptr)[2] = new (int(*[2])[2]);
  

Я не совсем уверен, что верю в это.

Комментарии:

1. Спасибо, хотя я пытаюсь использовать новые

2. @Melissa См. Редактирование. Я работаю над версией без typedef.

Ответ №2:

Учитывая все сказанное о контейнерах, вы можете сделать это:

 int (*ptr)[4][2];


ptr = new int[2][4][2]{{{2,3},{-4,0},{3,-7},{2,2}},{{1,1},{-2,-3},{4,12},{-5,25}}};
  

Комментарии:

1. Спасибо! Хотя, как я могу вызвать values1 и values2 вместо записи всех значений в {}? ptr = new int[2][4][2]{amp;values1,amp;values2} не работает

2. Также является ли это динамическим массивом?

3. Вы не можете написать это так, потому что {} здесь творит волшебство 🙂

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

5. Динамический в том смысле, что он динамически распределяется. Не динамический в том смысле, что он не будет расширяться при добавлении новых значений.