Прототип функции 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.