Функция memcpy

Прототип функции memcpy:

void * memcpy( void * destptr, const void * srcptr, size_t num );

Заголовочный файл:

Название Язык
string.h С
cstring С++

Описание

Функция memcpy копирует num байтов первого блока памяти, на который ссылается указатель srcptr, во второй блок памяти, на который ссылается указатель destptr.

Тип данных объектов, на которые указывают как srcptr так и destptr  не имеют никакого значения. Так как эта функция работает с бинарными данными.

Функция не проверяет, есть ли символ завершения в srcptr, она всегда копирует количество байтов, указанное в num.

Чтобы избежать переполнения блока памяти destptr, размер destptr должен быть не менее num байтов. Однако, может возникнуть ситуация, когда destptr и srcptr пересекутся. Поэтому, для перекрытия блоков памяти, функция memmove является более безопасным подходом.

Параметры:

  • destptr
    Указатель на блок памяти назначения (куда будут копироваться байты данных), имеет тип данных void.
  • srcptr
    Указатель на блок памяти источник (т. е., откуда будут копироваться байты данных), имеет тип данных void.
  • num
    Количество копируемых байтов.

Возвращаемое значение

Указатель на блок памяти назначения.

Пример: исходный код программы

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

#include <iostream>
#include <cstring>

int main()
{
  char str1[] = "Пример строки";
  char str2[40];
  char str3[60];

  memcpy (str2, str1, strlen(str1)+1);               // копируем строку str1  и сохраняем в str2
  memcpy (str3, "Копирование успешно выполнено",60); // копируем 60 байт строки и сохраняем в str3
  std::cout << "str1: "   << str1
            << "nstr2: " << str2
            << "nstr3: " << str3 << std::endl;
  return 0;
}

Пример работы программы

CppStudio.com
str1: Пример строки
str2: Пример строки
str3: Копирование успешно выполнено
Автор: admin
Дата: 31.08.2012
Поделиться:

Комментарии

  1. kpanat .

    Ну собственно как раз эта функция и не работает. Особенно усовершенствованная модель… Только для неперекрывающихся блоков. Хотя раньше она работала и для перекрывающихся также, но только когда копирование назад делалось. Вперёд она затирает ещё нескопированные данные. Поэтому она и не работает.  Но если копировать не от начала к концу строки а наоборот, то будет копировать вперёд. Но назад будет затирать.  А если варьировать направление копирования в зависимости от направления сдвига блока, то можно сделать корректное и быстрое копирование для всех случаев. Но в функции memcpy этот параметр(направление копирования) прописан внутри, жёстко фиксирован вперёд и не меняется… Надо писать свой вариант memcpy.

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.