Расположение записи нарушения прав доступа 0xCCCCCCCC при создании 2d массива - PullRequest
0 голосов
/ 14 октября 2019

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

Вот мой код:

bool b_alloc_table_2_dim(int ***piTable, int iSizeX, int iSizeY)
{
    *piTable = new int*[iSizeX];
    for (int ii = 0; ii < iSizeX; ii++)
        *piTable[ii] = new int[iSizeY]; // here i get the exception
    return true;
}

int main()
{
    int **x ;
    b_alloc_table_2_dim( &x, 3, 5);

    return 0;
}

Я не могу найти ничего плохого в коде. После вызова моей функции x должен указывать на 2d массив.

Ответы [ 2 ]

3 голосов
/ 14 октября 2019

Оператор [] имеет приоритет над *. cppreference

Таким образом, строка

*piTable[ii] = new int[iSizeY];

эквивалентна

*(piTable[ii]) = new int[iSizeY];

, что вы хотели написать:

(*piTable)[ii] = new int[iSizeY];
0 голосов
/ 14 октября 2019

Использование фактического контейнера

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

Вместо

int**

Для двумерного массива (матрицы) более подходящей структурой данных может быть

std::array< std::array<int, cols>, rows> 

, если размеры известны во время компиляции.


Если нет, вероятно, этоЛучше всего просто использовать один вектор ala.

auto my_array2d = std::vector<int>(rows*cols);//array now has 'rows*cols' elements of '0'

и выполнять индексацию самостоятельно.

Лучше всего, конечно, использовать библиотеку, например, или

...