Чистый C: копирование строк и столбцов 2D-массива с использованием указателей

#c #arrays #pointers

#c #массивы #указатели

Вопрос:

Предполагая, что я инициализировал массив int с использованием двойного указателя

 int **array;
 

Я использовал malloc, чтобы задать требуемый размер массива следующим образом

 array = malloc( sizeof *array * ROWS );
if ( array ){
    for ( size_t i = 0; i < ROWS; i   )
        *(array    i) = malloc( sizeof *(*(array    i)) * COLS );
}
 

Каждый индекс массива объявляется со случайным числом int.
Я пытаюсь найти более быстрый способ копирования строки или столбца вместо использования циклов for . Мой выбор — использовать memcpy, вначале это выглядело как хорошая идея, поскольку у меня не было проблем с копированием строки с помощью

 memcpy((array   1), (array   3), (int)sizeof(int **));
 

Однако, когда дело доходит до столбцов с использованием

 memcpy(*(array   1), *(array   3), (int)sizeof(int *));
 

на самом деле работает не так, как я ожидал, и был скопирован только один элемент. Есть ли что-то, чего мне не хватает?

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

1. Почему вам нравится обозначение указателя, то есть *(array 1) ; array[1] проще и удобочитаемо.

2. Как бы это » memcpy((array 1), (array 3), (int)sizeof(int **)); » скопировало больше байтов, чем количество байтов int** , используемых указателем типа (обычно 4 или 8 бит в зависимости от ОС)?

Ответ №1:

Для 2D-массива, если ваши строки расположены непрерывно в памяти (он же основной массив строк), то ваши столбцы не будут непрерывными.

memcpy с другой стороны, копирует только непрерывные фрагменты памяти. Поэтому вы не можете скопировать весь столбец одним вызовом memcpy . Вам скорее нужно будет копировать каждый элемент по одному, для чего вам это не нужно memcpy .