Прототип функции memmove:
void * memmove( void * destptr, const void * srcptr, size_t num );
Заголовочный файл:
| Название | Язык |
|---|---|
| string.h | С |
| cstring | С++ |
Описание
Переместить блок памяти. Функция копирует num байтов из блока памяти источника, на который ссылается указатель srcptr, в блок памяти назначения, на который указывает указатель destptr. Копирование происходит через промежуточный буфер, что, в свою очередь, не позволяет destination и srcptr пересекаться.
Тип данных объектов, на которые указывают как srcptr так и destptr не имеют никакого значения. Так как эта функция работает с бинарными данными. Функция не проверяет, есть ли символ завершения в srcptr, она всегда копирует количество байтов, указанное в num. Чтобы избежать переполнения блока памяти destptr, размер destptr должен быть не менее num байтов. Однако, может возникнуть ситуация, когда destptr и srcptr пересекутся.
Параметры:
- destptr
Указатель на блок памяти назначения (куда будут копироваться байты данных), имеет тип данныхvoid. - srcptr
Указатель на блок памяти источник (т. е., откуда будут копироваться байты данных), имеет тип данныхvoid. - num
Количество копируемых байтов.
Возвращаемое значение
Указатель на блок памяти назначения.
Пример: исходный код программы
//пример использования функции memmove
#include <iostream>
#include <cstring>
int main()
{
char str[] = "memmove может оказаться очень полезной функцией..............";
// перемещаем блок символов в памяти
memmove (str + 49, // таже самая строка, со сдвигом в 49 байт
str + 38, // копируем из str начиная с 38-го байта
47); // скопировать нужно 47 байт
std::cout << str << std::endl;
return 0;
}
Комментарии
kpanat .
Ну тут ошибка… написано «Копирование происходит через промежуточный буфер, что, в свою очередь, не позволяет
destinationиsrcptrпересекаться», а надо «Копирование происходит через промежуточный буфер, что, в свою очередь, позволяетdestinationиsrcptrпересекаться» Такая маленькая ошибочка, которая в корне меняет смысл. Но вообще лучше использовать другую функцию для пересекающихся блоков варьируя направлением копирования… Этот параметр не входит ни в одну строковую функцию. но все функции с ним неявно работают устанавливая направление копирования всегда вперёд.Хотя к примеру для корректной вставки необходимо выполнить копирование назад… Конечно вам придётся написать свою функцию. В стандарте и расширениях такой нет.gam507
Ошибка в примере. memmove(str+49,str+38,47). Нужно memmove(str+30,str+24,23).
admin
Для nix-систем тут нет ошибки, так как для хранения русских букв требуется два байта.