Двумерный массив в куче

float kek[2][6] = {
        {Forms[x].x + ((rf * 2) + nx), Forms[x].x - ((rf * 2) + nx), Forms[x].x + st, Forms[x].x - st, Forms[x].x + st, Forms[x].x - st},
        {Forms[x].y, Forms[x].y, Forms[x].y + (rf * 2), Forms[x].y + (rf * 2),Forms[x].y - (rf * 2), Forms[x].y - (rf * 2)}
    };

как мне сделать этот массив в куче?


Ответы (3 шт):

Автор решения: AR Hovsepyan

Например так:

 float** kek = new float* [2]{
     new float[6]{ Forms[x].x + ((rf * 2) + nx), 
     Forms[x].x - ((rf * 2) + nx),
     Forms[x].x + st, Forms[x].x - st,
     Forms[x].x + st, Forms[x].x - st
 },
     new float[6] {Forms[x].y,  Forms[x].y, 
     Forms[x].y + (rf * 2), Forms[x].y + (rf * 2),
     Forms[x].y - (rf * 2), Forms[x].y - (rf * 2)}
 };

Лучше в вопросе не показывать действия, не относящийся к вопросу. В частности к вопросу не относится все действия для получения значения элементов.

→ Ссылка
Автор решения: 232_159

Такой себе способ, из за проблем с утечками памяти:

    int** mass = new int*[2];              //массив указателей
    mass[0] = new int[4]{00, 01, 02, 03};  //массив значений
    mass[1] = new int[4]{10, 11, 12, 13};  

    delete mass[1];
    delete mass[0];
    delete mass;

Смысл в том, что мы сначала выделяем массив из указателей на переменную. В каждый элемент такого массива мы помещаем указатель на массив их переменных.

Какие минусы:

1) Выделяется больше памяти чем ожидается. В данном случае имеем 8 элементов типа int (пусть 4 байта) + 2 элемента типа int*(пусть 8 байт).

2) Очень сложный процесс удаления такого массива. Вообще рекомендуется в c++ уходить от прямой работы с памятью, т.к. такая работа подвержена ошибкам. Уже просто не рекомендуется тупо выделять массив в куче (new int[]), а мы здесь играем с указателями на указатель. Легко забыть удалить какой нибудь массив или удалить их в неправильном порядке:

//утечка памяти
delete mass;

//неопределенное поведение
delete mass;
delete mass[0];

//правильно
delete mass[0];
delete mass[1];
delete mass;

Если есть возможность, то, конечно, лучше использовать std::array< std::array<>> или std::vector< std::vector>.

→ Ссылка
Автор решения: dail45

Сложно найти это но(сам нашёл только у препода в документации написанной очень давно). Пример:

int n = 2;
float (*a)[3] = new float[n][3];

это указатель на массив, состоящий из массивов по 3 float'a. Заполнить его можно так:

a[0][0] = 1;
...
a[0][2] = 3;
...
...
...
a[1][3] = 5;

Удалить очень просто:

delete[] a;
→ Ссылка