Для копирования блоков памяти используются функции memcpy и memmove. Спецификации форматов их вызовов имеют вид:
void* memcpy (void* dest, const void* src, unsigned len);
void* memmove(void* dest, const void* src, unsigned len);

Обе функции идентичны по набору аргументов и коду возврата. Они должны обеспечивать копирование начальных len байтов исходной области памяти, адресуемой указателем src, в блок памяти, который назначен указателем dest, передавая его адрес через код возврата. Функция memcpy реализует прямую передачу данных между адресованными областями памяти. Поэтому ее целесообразно применять при обработке неперекрывающихся областей, чтобы гарантировать однозначность результата копирования. Функция memmove использует для передачи данных внутренний промежуточный массив, который не пересекается с адресуемыми областями памяти. Это позволяет получить однозначный результат копирования независимо от взаимного расположения заданных областей памяти в адресном пространстве программы, но ценой расхода дополнительных ресурсов. Следует учитывать, что при обработке перекрывающихся областей памяти, операция копирования имеет характер перемещения данных внутри блока памяти, причем, содержимое исходного блока может быть модифицировано.
Операции копирования блоков памяти функциями memcpy и memmove поясняет следующий фрагмент исходного кода, который обеспечивает инициализацию и модификацию символьного массива римских цифр:
char rom[5];                  /* массив для римских цифр */
memcpy(rom, "XVI", 3);        /* инициализация массива */
memmove(&rom[1], rom, 3);     /* модификация массива */
В приведенном фрагменте исходного кода функция memcpy копирует в пустой массив rom символы XVI, которые обозначают число 16 в римской системе счисления. После модификации в функции memmove, содержимое массива rom составляют символы XXVI, которые обозначают число 26 в римской системе счисления.