Копирование элементов из одного массива в другой

Для копирования элементов из одного массива в другой используются следующие функции:

  • memcpy() — копирует первые size байтов из массива src в массив dst. В качестве значения функция возвращает указатель на массив dst. Если массив src длиннее массива dst, то произойдет переполнение буфера. Если указатели пересекаются, то поведение функции непредсказуемо. Прототип функции:
#include <cstring> /* или #include <string.h>
                      или #include <memory.h> */
void *memcpy(void *dst, const void *src, size_t size);

Пример использования функции:

const int ARR1_SIZE = 5, ARR2_SIZE = 3;
int arr1[ARR1_SIZE] = {0}, arr2[ARR2_SIZE] = {1, 2, 3};
int *p = nullptr, i = 0;
// Копируем все элементы массива arr2
p = (int *)std::memcpy(arr1, arr2, sizeof arr2);
for (i = 0; i < ARR1_SIZE; ++i) {
   std::cout << arr1[i] << " ";
} // 1 2 3 0 0
std::cout << std::endl;
if (!p) exit(1);
// Перемещаем указатель на четвертый элемент массива
p += 3;
// Копируем только два первых элемента массива arr2
std::memcpy(p, arr2, 2 * sizeof(int));
for (i = 0; i < ARR1_SIZE; ++i) {
   std::cout << arr1[i] << " ";
} // 1 2 3 1 2
std::cout << std::endl;

Вместо функции memcpy() лучше использовать функцию memcpy_s(). Прототип функции:

#include <cstring> /* или #include <string.h>
                      или #include <memory.h> */
errno_t memcpy_s(void *dst, size_t dstSize, const void *src,
                 size_t maxCount);

Функция memcpy_s() копирует первые maxCount байтов из массива src в массив dst. В параметре dstSize указывается размер массива dst в байтах. Если копирование прошло успешно функция возвращает значение 0. Пример:

const int ARR1_SIZE = 5, ARR2_SIZE = 3;
int arr1[ARR1_SIZE] = {0}, arr2[ARR2_SIZE] = {1, 2, 3};
// Копируем только два первых элемента массива arr2
memcpy_s(arr1, sizeof arr1, arr2, 2 * sizeof(int));
for (int i = 0; i < ARR1_SIZE; ++i) {
   std::cout << arr1[i] << " ";
} // 1 2 0 0 0
std::cout << std::endl;
  • memmove() — копирует первые size байтов из массива src в массив dst. В качестве значения функция возвращает указатель на массив dst. Если массив src длиннее массива dst, то произойдет переполнение буфера. Основное отличие функции memmove() от memcpy() в выполнении корректных действий при пересечении указателей. Прототип функции:
#include <cstring> /* или #include <string.h> */
void *memmove(void *dst, const void *src, size_t size);

Пример:

const int ARR_SIZE = 5;
int arr[ARR_SIZE] = {1, 2, 3, 4, 5}, *p = nullptr;
p = arr + 2;
// Указатели пересекаются
std::memmove(p, arr, 3 * sizeof(int));
for (int i = 0; i < ARR_SIZE; ++i) {
   std::cout << arr[i] << ' ';
} // 1 2 1 2 3 - копирование произведено корректно
std::cout << std::endl;

Вместо функции memmove() лучше использовать функцию memmove_s(). Прототип функции:

#include <cstring> /* или #include <string.h> */
errno_t memmove_s(void *dst, size_t dstSize, const void *src,
                  size_t maxCount);

Функция memmove_s() копирует первые maxCount байтов из массива src в массив dst. В параметре dstSize указывается размер массива dst в байтах. Если копирование прошло успешно функция возвращает значение 0. Пример:

const int ARR_SIZE = 5;
int arr[ARR_SIZE] = {1, 2, 3, 4, 5}, *p = nullptr;
p = arr + 2;
memmove_s(p, sizeof arr, arr, 3 * sizeof(int));
for (int i = 0; i < ARR_SIZE; ++i) {
   std::cout << arr[i] << ' ';
} // 1 2 1 2 3
std::cout << std::endl;
На заметку

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов