Прототип функции 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;
}
Пример работы программы
str2: Пример строки
str3: Копирование успешно выполнено
Комментарии
kpanat .
Ну собственно как раз эта функция и не работает. Особенно усовершенствованная модель… Только для неперекрывающихся блоков. Хотя раньше она работала и для перекрывающихся также, но только когда копирование назад делалось. Вперёд она затирает ещё нескопированные данные. Поэтому она и не работает. Но если копировать не от начала к концу строки а наоборот, то будет копировать вперёд. Но назад будет затирать. А если варьировать направление копирования в зависимости от направления сдвига блока, то можно сделать корректное и быстрое копирование для всех случаев. Но в функции memcpy этот параметр(направление копирования) прописан внутри, жёстко фиксирован вперёд и не меняется… Надо писать свой вариант memcpy.