#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
.