Не могу присвоить указателю указатель

Есть функция vertical_2d_shift. Принимает двумерный массив (в виде указателя на указатель) и сдвигает его строчки циклически на 1 вниз.

Принцип работы - создаю ещё один двумерный массив. Потом говорю, что указатель на первую строку нового массива это указатель на последнюю старого, указатель на 1-ю есть указатель на 0 старого и так далее. А потом просто говорю, что новый массив теперь вместо старого.

template<typename T>
T** make_2d_array(int n, int m) {
    T** arr = (T**)malloc(n * sizeof(T*));
    for(int i = 0; i < n; i++) {
        arr[i] = (T*)malloc(m * sizeof(T));
    }
    return arr;
}

template<typename T>
void vertical_2d_shift(T** arr, int n, int m) {

    T** new_arr = make_2d_array<T>(n, m);

    new_arr[0] = arr[n - 1];

    for(int i = 0; i < n - 1; i++) {
        new_arr[i + 1] = arr[i];
    }

    arr = new_arr;
    //for(int i = 0; i < n; i++) {
    //    arr[i] = new_arr[i];
    //}
}

Этот код почему-то не работает. То есть arr не меняется и никакого циклического сдвига не происходит. Но если я закомментирую arr = new_arr; и раскомментирую цикл, что после него, всё сработает. Но почему?

Почему я не могу просто подменить указатель одного двумерного массива на указатель другого и так будто подменить сам массив? Я даже выводил адрес arr до и после присвоения - ничего не меняется.

И в то же самое время, когда я делаю то же самое не для двумерного массива**, а для одномерного*, проблем не возникает (я как минимум про тот for).


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

Автор решения: Zhihar

Решение:

template<typename T>
void vertical_2d_shift(T** &arr, int n, int m) {

чтобы менять массив его надо передавать в функцию по ссылке

Еще одна ошибка в коде - вы не удаляете старый массив в самом конце и в итоге программа течет

Ну и самое главное - зачем так сложно - зачем вообще создавать новый массив, когда вы можете в старом массиве просто изменить циклически указатели

template<typename T>
void vertical_2d_shift(T** arr, int n, int m) {

    T* tmp = arr[n - 1];

    for(int i = n - 1; i > 0; i--) {        
        arr[i] = arr[i - 1];
    }

    arr[0] = tmp;
 }
→ Ссылка